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"

Reply via email to