mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-05-16 16:01:44 -04:00
selftests/nolibc: Check that snprintf() doesn't write beyond the buffer end
Fill buf[] with known data and check the vsnprintf() doesn't write beyond the specified buffer length. Would have picked up the bug in field padding. Signed-off-by: David Laight <david.laight.linux@gmail.com> Acked-by: Willy Tarreau <w@1wt.eu> Link: https://patch.msgid.link/20260302101815.3043-7-david.laight.linux@gmail.com Signed-off-by: Thomas Weißschuh <linux@weissschuh.net>
This commit is contained in:
committed by
Thomas Weißschuh
parent
f36e1ec61a
commit
4ea2dedd50
@@ -1679,6 +1679,10 @@ static int expect_vfprintf(int llen, const char *expected, const char *fmt, ...)
|
||||
va_list args;
|
||||
ssize_t w, expected_len;
|
||||
|
||||
/* Fill and terminate buf[] to check for overlong/absent writes */
|
||||
memset(buf, 0xa5, sizeof(buf) - 1);
|
||||
buf[sizeof(buf) - 1] = 0;
|
||||
|
||||
va_start(args, fmt);
|
||||
/* Limit buffer length to test truncation */
|
||||
w = vsnprintf(buf, VFPRINTF_LEN + 1, fmt, args);
|
||||
@@ -1710,6 +1714,15 @@ static int expect_vfprintf(int llen, const char *expected, const char *fmt, ...)
|
||||
return 1;
|
||||
}
|
||||
|
||||
/* Check for any overwrites after the actual data. */
|
||||
while (++cmp_len < sizeof(buf) - 1) {
|
||||
if ((unsigned char)buf[cmp_len] != 0xa5) {
|
||||
llen += printf(" overwrote buf[%d] with 0x%x", cmp_len, buf[cmp_len]);
|
||||
result(llen, FAIL);
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
result(llen, OK);
|
||||
return 0;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user