fix swprintf internal buffer state and error handling
authorRich Felker <dalias@aerifal.cx>
Tue, 8 Nov 2016 01:39:59 +0000 (20:39 -0500)
committerRich Felker <dalias@aerifal.cx>
Tue, 8 Nov 2016 01:39:59 +0000 (20:39 -0500)
the swprintf write callback never reset its buffer pointers, so after
its 256-byte buffer filled up, it would keep repeating those bytes
over and over in the output until the destination buffer filled up. it
also failed to set the error indicator for the stream on EILSEQ,
potentially allowing output to continue after the error.

src/stdio/vswprintf.c

index 7d237bae72e945e5e4fdc459090e6ab75333636a..6eb2f6acbb22c3e2f9e461df1220c0b38e976a4d 100644 (file)
@@ -24,7 +24,14 @@ static size_t sw_write(FILE *f, const unsigned char *s, size_t l)
                c->ws++;
        }
        *c->ws = 0;
-       return i<0 ? i : l0;
+       if (i < 0) {
+               f->wpos = f->wbase = f->wend = 0;
+               f->flags |= F_ERR;
+               return i;
+       }
+       f->wend = f->buf + f->buf_size;
+       f->wpos = f->wbase = f->buf;
+       return l0;
 }
 
 int vswprintf(wchar_t *restrict s, size_t n, const wchar_t *restrict fmt, va_list ap)