Module Name: src Committed By: rillig Date: Fri Feb 16 01:19:53 UTC 2024
Modified Files: src/tests/lib/libutil: t_snprintb.c Log Message: tests/snprintb: clean up existing tests, add more tests Due to the check that any bytes beyond the expected output must be unmodified, there's no need anymore to explicitly write the "ZZZ" at the end of the expected output. While here, remove the redundant trailing "\0". Add more tests to cover possible situations where an out-of-bounds write may have occurred. In some cases, the line length specified in snprintb_m is exceeded. To generate a diff of this commit: cvs rdiff -u -r1.15 -r1.16 src/tests/lib/libutil/t_snprintb.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/tests/lib/libutil/t_snprintb.c diff -u src/tests/lib/libutil/t_snprintb.c:1.15 src/tests/lib/libutil/t_snprintb.c:1.16 --- src/tests/lib/libutil/t_snprintb.c:1.15 Thu Feb 15 23:48:51 2024 +++ src/tests/lib/libutil/t_snprintb.c Fri Feb 16 01:19:53 2024 @@ -1,4 +1,4 @@ -/* $NetBSD: t_snprintb.c,v 1.15 2024/02/15 23:48:51 rillig Exp $ */ +/* $NetBSD: t_snprintb.c,v 1.16 2024/02/16 01:19:53 rillig Exp $ */ /* * Copyright (c) 2002, 2004, 2008, 2010, 2024 The NetBSD Foundation, Inc. @@ -32,7 +32,7 @@ #include <sys/cdefs.h> __COPYRIGHT("@(#) Copyright (c) 2008, 2010\ The NetBSD Foundation, inc. All rights reserved."); -__RCSID("$NetBSD: t_snprintb.c,v 1.15 2024/02/15 23:48:51 rillig Exp $"); +__RCSID("$NetBSD: t_snprintb.c,v 1.16 2024/02/16 01:19:53 rillig Exp $"); #include <stdio.h> #include <string.h> @@ -104,13 +104,13 @@ h_snprintb_loc(const char *file, size_t (uintmax_t)val, exp_rv, vis_arr(res, reslen), rv, vis_arr(buf, reslen)); - check_unmodified_loc(file, line, buf, reslen + 1, sizeof(buf)); + check_unmodified_loc(file, line, buf, reslen, sizeof(buf)); } #define h_snprintb_len(bufsize, fmt, val, exp_rv, res) \ h_snprintb_loc(__FILE__, __LINE__, \ bufsize, fmt, sizeof(fmt) - 1, val, \ - exp_rv, res, sizeof(res) - 1) + exp_rv, res, sizeof(res)) #define h_snprintb(fmt, val, res) \ h_snprintb_len(1024, fmt, val, sizeof(res) - 1, res) @@ -250,44 +250,44 @@ ATF_TC_BODY(snprintb, tc) // behavior due to out-of-bounds 'bp' pointer. h_snprintb_len( 0, "\020", 0, - 1, "ZZZ"); + 1, ""); #endif h_snprintb_len( 1, "\020", 0, - 1, "\0ZZZ"); + 1, ""); h_snprintb_len( 2, "\020", 0, - 1, "0\0ZZZ"); + 1, "0"); h_snprintb_len( 3, "\020", 0, - 1, "0\0ZZZ"); + 1, "0"); h_snprintb_len( 3, "\020", 7, - 3, "0x\0ZZZ"); + 3, "0x"); h_snprintb_len( 4, "\020", 7, - 3, "0x7\0ZZZ"); + 3, "0x7"); h_snprintb_len( 7, "\020\001lsb", 7, - 8, "0x7<ls\0ZZZ"); + 8, "0x7<ls"); h_snprintb_len( 8, "\020\001lsb", 7, - 8, "0x7<lsb\0ZZZ"); + 8, "0x7<lsb"); h_snprintb_len( 9, "\020\001lsb", 7, - 8, "0x7<lsb>\0ZZZ"); + 8, "0x7<lsb>"); h_snprintb_len( 9, "\020\001one\002two", 7, - 12, "0x7<one,\0ZZZ"); + 12, "0x7<one,"); h_snprintb_len( 10, "\020\001one\002two", 7, - 12, "0x7<one,t\0ZZZ"); + 12, "0x7<one,t"); h_snprintb_len( 12, "\020\001one\002two", 7, - 12, "0x7<one,two\0ZZZ"); + 12, "0x7<one,two"); h_snprintb_len( 13, "\020\001one\002two", 7, - 12, "0x7<one,two>\0ZZZ"); + 12, "0x7<one,two>"); // new-style format, single bits, octal h_snprintb( @@ -596,44 +596,44 @@ ATF_TC_BODY(snprintb, tc) // behavior due to out-of-bounds 'bp' pointer. h_snprintb_len( 0, "\177\020", 0, - 1, "ZZZ"); + 1, ""); #endif h_snprintb_len( 1, "\177\020", 0, - 1, "\0ZZZ"); + 1, ""); h_snprintb_len( 2, "\177\020", 0, - 1, "0\0ZZZ"); + 1, "0"); h_snprintb_len( 3, "\177\020", 0, - 1, "0\0ZZZ"); + 1, "0"); h_snprintb_len( 3, "\177\020", 7, - 3, "0x\0ZZZ"); + 3, "0x"); h_snprintb_len( 4, "\177\020", 7, - 3, "0x7\0ZZZ"); + 3, "0x7"); h_snprintb_len( 7, "\177\020b\000lsb\0", 7, - 8, "0x7<ls\0ZZZ"); + 8, "0x7<ls"); h_snprintb_len( 8, "\177\020b\000lsb\0", 7, - 8, "0x7<lsb\0ZZZ"); + 8, "0x7<lsb"); h_snprintb_len( 9, "\177\020b\000lsb\0", 7, - 8, "0x7<lsb>\0ZZZ"); + 8, "0x7<lsb>"); h_snprintb_len( 9, "\177\020b\000one\0b\001two\0", 7, - 12, "0x7<one,\0ZZZ"); + 12, "0x7<one,"); h_snprintb_len( 10, "\177\020b\000one\0b\001two\0", 7, - 12, "0x7<one,t\0ZZZ"); + 12, "0x7<one,t"); h_snprintb_len( 12, "\177\020b\000one\0b\001two\0", 7, - 12, "0x7<one,two\0ZZZ"); + 12, "0x7<one,two"); h_snprintb_len( 13, "\177\020b\000one\0b\001two\0", 7, - 12, "0x7<one,two>\0ZZZ"); + 12, "0x7<one,two>"); } @@ -670,13 +670,13 @@ h_snprintb_m_loc(const char *file, size_ max, exp_rv, vis_arr(res, reslen), total, vis_arr(buf, reslen)); - check_unmodified_loc(file, line, buf, reslen + 1, sizeof(buf)); + check_unmodified_loc(file, line, buf, reslen, sizeof(buf)); } #define h_snprintb_m_len(bufsize, fmt, val, line_max, exp_rv, res) \ h_snprintb_m_loc(__FILE__, __LINE__, \ bufsize, fmt, sizeof(fmt) - 1, val, line_max, \ - exp_rv, res, sizeof(res) - 1) + exp_rv, res, sizeof(res)) #define h_snprintb_m(fmt, val, max, res) \ h_snprintb_m_len(1024, fmt, val, max, sizeof(res) - 1, res) @@ -697,22 +697,14 @@ ATF_TC_BODY(snprintb_m, tc) 0xffff, 6, 143, - /* 0 */ "0xffff>\0" - /* 8 */ "0xffff<>\0" - /* 17 */ "0xffffb>\0" - /* 26 */ "0xffffi>\0" - /* 35 */ "0xfffft>\0" - /* 44 */ "0xffff1>\0" - /* 53 */ "0xffff<>\0" - /* 62 */ "0xff\0\0ZZ" - /* 70 */ "ZZZZZZZZZZ" - /* 80 */ "ZZZZZZZZZZ" - /* 90 */ "ZZZZZZZZZZ" - /* 100 */ "ZZZZZZZZZZ" - /* 110 */ "ZZZZZZZZZZ" - /* 120 */ "ZZZZZZZZZZ" - /* 130 */ "ZZZZZZZZZZ" - /* 140 */ "ZZZZZZZZZZ" + "0xffff>\0" + "0xffff<>\0" + "0xffffb>\0" + "0xffffi>\0" + "0xfffft>\0" + "0xffff1>\0" + "0xffff<>\0" + "0xff\0" ); // new-style format, small maximum line length @@ -725,33 +717,171 @@ ATF_TC_BODY(snprintb_m, tc) 0xffff, 6, 143, - /* 0 */ "0xffff>\0" - /* 8 */ "0xffff<>\0" - /* 17 */ "0xffffb>\0" - /* 26 */ "0xffffi>\0" - /* 35 */ "0xfffft>\0" - /* 44 */ "0xffff1>\0" - /* 53 */ "0xffff<>\0" - /* 62 */ "0xff\0\0ZZ" - /* 70 */ "ZZZZZZZZZZ" - /* 80 */ "ZZZZZZZZZZ" - /* 90 */ "ZZZZZZZZZZ" - /* 100 */ "ZZZZZZZZZZ" - /* 110 */ "ZZZZZZZZZZ" - /* 120 */ "ZZZZZZZZZZ" - /* 130 */ "ZZZZZZZZZZ" - /* 140 */ "ZZZZZZZZZZ" + "0xffff>\0" + "0xffff<>\0" + "0xffffb>\0" + "0xffffi>\0" + "0xfffft>\0" + "0xffff1>\0" + "0xffff<>\0" + "0xff\0" + ); + + // new-style format, buffer too small for number + h_snprintb_m_len( + 2, + "\177\020", + 0, + 64, + 2, + "\0" + ); + + // new-style format, buffer too small for '<' + h_snprintb_m_len( + 6, + "\177\020" + "b\000lsb\0", + 0xff, + 64, + 10, + "0xff\0" ); // new-style format, buffer too small for description h_snprintb_m_len( - 8, + 7, "\177\020" - "b\000bit1\0", - 0x0001, + "b\000lsb\0", + 0xff, 64, 10, - "0x1<bi\0\0ZZZ" + "0xff<\0" + ); + + // new-style format, buffer too small for complete description + h_snprintb_m_len( + 9, + "\177\020" + "b\000lsb\0", + 0xff, + 64, + 10, + "0xff<ls\0" + ); + + // new-style format, buffer too small for '>' + h_snprintb_m_len( + 10, + "\177\020" + "b\000lsb\0", + 0xff, + 64, + 10, + "0xff<lsb\0" + ); + + // new-style format, buffer too small for second line + h_snprintb_m_len( + 11, + "\177\020" + "b\000lsb\0" + "b\001two\0", + 0xff, + 11, + 20, + "0xff<lsb>\0" + ); + + // new-style format, buffer too small for number in line 2 + h_snprintb_m_len( + 12, + "\177\020" + "b\000lsb\0" + "b\001two\0", + 0xff, + 11, + 20, + "0xff<lsb>\0" + "\0" + ); + + // new-style format, buffer too small for complete number in line 2 + h_snprintb_m_len( + 15, + "\177\020" + "b\000lsb\0" + "b\001two\0", + 0xff, + 11, + 20, + "0xff<lsb>\0" + "0xf\0" // XXX: incomplete number may be misleading + ); + + // new-style format, buffer too small for '<' in line 2 + h_snprintb_m_len( + 16, + "\177\020" + "b\000lsb\0" + "b\001two\0", + 0xff, + 11, + 20, + "0xff<lsb>\0" + "0xff\0" + ); + + // new-style format, buffer too small for description in line 2 + h_snprintb_m_len( + 17, + "\177\020" + "b\000lsb\0" + "b\001two\0", + 0xff, + 11, + 20, + "0xff<lsb>\0" + "0xff<\0" + ); + + // new-style format, line too small for unmatched field value + h_snprintb_m_len( + 30, + "\177\020" + "f\000\004bits\0" + ":\000other\0", + 0xff, + 11, + 22, + "0xff<bits=0xf>\0" // XXX: line too long (14 > 11) + "0xff#>\0" // XXX: why '#'? unbalanced '<>' + ); + + // new-style format, line too small for field value + h_snprintb_m_len( + 30, + "\177\020" + "f\000\004bits\0" + ":\017other\0", + 0xff, + 11, + 27, + "0xff<bits=0xf>\0" // XXX: line too long (14 > 11) + "0xff#other>\0" // XXX: unbalanced '<>' + ); + + // new-style format, buffer too small for fallback + h_snprintb_m_len( + 20, + "\177\020" + "f\000\004bits\0" + "*=fallback\0" + "b\0024\0", + 0xff, + 64, + 26, + "0xff<bits=0xf=fall\0" ); h_snprintb_m( @@ -766,7 +896,8 @@ ATF_TC_BODY(snprintb_m, tc) 0x800f0701, 33, "0x800f0701<LSB,NIBBLE2=0>\0" - "0x800f0701<BURST=0xf=FIFTEEN,MSB>\0"); + "0x800f0701<BURST=0xf=FIFTEEN,MSB>\0" + ); h_snprintb_m( "\177\020"