Fix %c with nul character

Fixes #417
This commit is contained in:
Justine Tunney 2022-06-12 22:25:42 -07:00
parent 91953dd308
commit 3c285337a2
2 changed files with 19 additions and 6 deletions

View file

@ -335,12 +335,16 @@ hidden int __fmt(void *fn, void *arg, const char *format, va_list va) {
break; break;
} }
case 'c': case 'c':
prec = 1; if ((charbuf[0] = va_arg(va, int))) {
flags |= FLAGS_PRECISION; p = charbuf;
qchar = '\''; qchar = '\'';
p = charbuf; flags |= FLAGS_PRECISION;
charbuf[0] = va_arg(va, int); prec = 1;
goto FormatString; goto FormatString;
} else {
__FMT_PUT('\0');
break;
}
case 'm': case 'm':
p = weaken(strerror) ? weaken(strerror)(lasterr) : "?"; p = weaken(strerror) ? weaken(strerror)(lasterr) : "?";
signbit = 0; signbit = 0;

View file

@ -283,6 +283,15 @@ TEST(fmt, quoted) {
ASSERT_STREQ("\"hello\" ", gc(xasprintf("%-`*.*s", 10, 5, "hello"))); ASSERT_STREQ("\"hello\" ", gc(xasprintf("%-`*.*s", 10, 5, "hello")));
} }
TEST(fmt, nulCharacter) {
char b[3] = {1, 1, 1};
ASSERT_EQ(1, snprintf(0, 0, "%c", 0));
ASSERT_EQ(1, snprintf(b, 3, "%c", 0));
ASSERT_EQ(0, b[0]);
ASSERT_EQ(0, b[1]);
ASSERT_EQ(1, b[2]);
}
TEST(fmt, regress) { TEST(fmt, regress) {
char buf[512]; char buf[512];
const char *meth = "GET"; const char *meth = "GET";