]> git.ipfire.org Git - thirdparty/libbsd.git/commitdiff
Fix heap buffer overflow in fgetwln()
authorHanno Boeck <hanno@hboeck.de>
Wed, 27 Jan 2016 14:10:11 +0000 (15:10 +0100)
committerGuillem Jover <guillem@hadrons.org>
Wed, 27 Jan 2016 14:24:50 +0000 (15:24 +0100)
In the function fgetwln() there's a 4 byte heap overflow.

There is a while loop that has this check to see whether there's still
enough space in the buffer:

if (!fb->len || wused > fb->len) {

If this is true more memory gets allocated. However this test won't be
true if wused == fb->len, but at that point wused already points out
of the buffer. Some lines later there's a write to the buffer:

fb->wbuf[wused++] = wc;

This bug was found with the help of address sanitizer.

Warned-by: ASAN
Fixes: https://bugs.freedesktop.org/show_bug.cgi?id=93881
Signed-off-by: Guillem Jover <guillem@hadrons.org>
src/fgetwln.c

index 9ee0776882dc618eb8b1391791801043d9c96f79..aa3f927b48c7d64381137fe97155b5ec134a41d2 100644 (file)
@@ -60,7 +60,7 @@ fgetwln(FILE *stream, size_t *lenp)
        fb->fp = stream;
 
        while ((wc = fgetwc(stream)) != WEOF) {
-               if (!fb->len || wused > fb->len) {
+               if (!fb->len || wused >= fb->len) {
                        wchar_t *wp;
 
                        if (fb->len)