fix buffer overflow in mbsrtowcs
authorRich Felker <dalias@aerifal.cx>
Fri, 27 Sep 2013 17:09:46 +0000 (13:09 -0400)
committerRich Felker <dalias@aerifal.cx>
Fri, 27 Sep 2013 17:09:46 +0000 (13:09 -0400)
issue reported by Michael Forney:

"If wn becomes 0 after processing a chunk of 4, mbsrtowcs currently
continues on, wrapping wn around to -1, causing the rest of the string
to be processed.

This resulted in buffer overruns if there was only space in ws for wn
wide characters."

the original patch submitted added an additional check for !wn after
the loop; to avoid extra branching, I instead just changed the wn>=4
check to wn>=5 to ensure that at least one slot remains after the
word-at-a-time loop runs. this should not slow down the tail
processing on real-world usage, since an extra slot that can't be
processed in the word-at-a-time loop is needed for the null
termination anyway.

src/multibyte/mbsrtowcs.c

index b9bbc33daf54c7071c2a527c9eb725d5a912f30d..066cce600772de1d331a3594b4d5efe68f31f871 100644 (file)
@@ -59,7 +59,7 @@ resume0:
                        return wn0;
                }
                if (*s-1u < 0x7f && (uintptr_t)s%4 == 0) {
-                       while (wn>=4 && !(( *(uint32_t*)s | *(uint32_t*)s-0x01010101) & 0x80808080)) {
+                       while (wn>=5 && !(( *(uint32_t*)s | *(uint32_t*)s-0x01010101) & 0x80808080)) {
                                *ws++ = *s++;
                                *ws++ = *s++;
                                *ws++ = *s++;