]> xenbits.xensource.com Git - people/julieng/freebsd.git/commitdiff
Addition to prev. commit.
authorache <ache@FreeBSD.org>
Sun, 1 Nov 2015 06:47:05 +0000 (06:47 +0000)
committerache <ache@FreeBSD.org>
Sun, 1 Nov 2015 06:47:05 +0000 (06:47 +0000)
In some edge cases fp->_p can be changed in _sseek(), recalculate.

PR:     204156
MFC after:      1 week

lib/libc/stdio/ftell.c

index 8cf94ee39c91591a86c2c5fb4e5c2b54cb47da22..61ebee9ca7318148275dd6fd7817575605b60a99 100644 (file)
@@ -125,10 +125,6 @@ _ftello(FILE *fp, fpos_t *offset)
                 * underlying object.
                 */
                n = fp->_p - fp->_bf._base;
-               if (pos > OFF_MAX - n) {
-                       errno = EOVERFLOW;
-                       return (1);
-               }
                if (n > 0 &&
                    ((fp->_flags & __SAPP) || (fp->_flags2 & __S2OAP))) {
                        int serrno = errno;
@@ -147,6 +143,12 @@ _ftello(FILE *fp, fpos_t *offset)
                                }
                        }
                        errno = serrno;
+                       /* fp->_p can be changed in _sseek(), recalculate. */
+                       n = fp->_p - fp->_bf._base;
+               }
+               if (pos > OFF_MAX - n) {
+                       errno = EOVERFLOW;
+                       return (1);
                }
                pos += n;
        }