From 8eceacc0d3ac8714b9f4d986bc4bb17ff19d05bd Mon Sep 17 00:00:00 2001 From: "Sergio R. Caprile" Date: Tue, 27 Oct 2026 17:30:26 -0300 Subject: [PATCH] survive to width.precision screw ups in %s --- mongoose.c | 7 ++++++- src/fmt.c | 7 ++++++- test/unit_test.c | 5 +++++ 3 files changed, 17 insertions(+), 2 deletions(-) diff --git a/mongoose.c b/mongoose.c index e06b827f..4f9d77e6 100644 --- a/mongoose.c +++ b/mongoose.c @@ -2968,7 +2968,12 @@ size_t mg_vxprintf(void (*out)(char, void *), void *param, const char *fmt, n++; } else if (c == 's') { char *p = va_arg(*ap, char *); - if (pr == ~0U) pr = p == NULL ? 0 : strlen(p); + if (p != NULL && pr != ~0U) { + for (j = 0; j < pr && p[j] != '\0'; j++) ; // portable strnlen() + pr = j; + } else { + pr = p == NULL ? 0 : strlen(p); + } for (j = 0; !minus && pr < w && j + pr < w; j++) n += scpy(out, param, &pad, 1); n += scpy(out, param, p, pr); diff --git a/src/fmt.c b/src/fmt.c index 0f19e691..dffbd20f 100644 --- a/src/fmt.c +++ b/src/fmt.c @@ -214,7 +214,12 @@ size_t mg_vxprintf(void (*out)(char, void *), void *param, const char *fmt, n++; } else if (c == 's') { char *p = va_arg(*ap, char *); - if (pr == ~0U) pr = p == NULL ? 0 : strlen(p); + if (p != NULL && pr != ~0U) { + for (j = 0; j < pr && p[j] != '\0'; j++) ; // portable strnlen() + pr = j; + } else { + pr = p == NULL ? 0 : strlen(p); + } for (j = 0; !minus && pr < w && j + pr < w; j++) n += scpy(out, param, &pad, 1); n += scpy(out, param, p, pr); diff --git a/test/unit_test.c b/test/unit_test.c index 22434439..20b6a82f 100644 --- a/test/unit_test.c +++ b/test/unit_test.c @@ -2399,10 +2399,15 @@ static void test_str(void) { ASSERT(sn("%.*s", 1, "ab")); ASSERT(sn("%.1s", "ab")); ASSERT(sn("%.99s", "a")); + ASSERT(sn("%10.8s", "abc")); + ASSERT(sn("%-6.4s", "ab")); + ASSERT(sn("%5.1s", "")); ASSERT(sn("%11s", "a")); ASSERT(sn("%s", "a\0b")); ASSERT(sn("%2s", "a")); ASSERT(sn("%.*s", 3, "a\0b")); + ASSERT(mg_snprintf(NULL, 0, "%.8s", (char *) NULL) == 0); + ASSERT(mg_snprintf(NULL, 0, "%8.4s", (char *) NULL) == 8); ASSERT(sn("%d", 7)); ASSERT(sn("%d", 123)); #if MG_ARCH == MG_ARCH_UNIX