On Fri, Oct 21, 2022 at 08:03:40AM +0200, Willy Tarreau wrote: > This adds 7 combinations of input values for memcmp() using signed and > unsigned bytes, which will trigger on the original code before Rasmus' > fix. This is mostly aimed at helping backporters verify their work, and > showing how tests for corner cases can be added to the selftests suite. > > Before the fix it reports: > 12 memcmp_20_20 = 0 [OK] > 13 memcmp_20_60 = -64 [OK] > 14 memcmp_60_20 = 64 [OK] > 15 memcmp_20_e0 = 64 [FAIL] > 16 memcmp_e0_20 = -64 [FAIL] > 17 memcmp_80_e0 = -96 [OK] > 18 memcmp_e0_80 = 96 [OK] > > And after: > 12 memcmp_20_20 = 0 [OK] > 13 memcmp_20_60 = -64 [OK] > 14 memcmp_60_20 = 64 [OK] > 15 memcmp_20_e0 = -192 [OK] > 16 memcmp_e0_20 = 192 [OK] > 17 memcmp_80_e0 = -96 [OK] > 18 memcmp_e0_80 = 96 [OK] > > Cc: Rasmus Villemoes <linux@xxxxxxxxxxxxxxxxxx> > Signed-off-by: Willy Tarreau <w@xxxxxx> I have pulled both of these in, thank you! One thing, though... I had to do "make clean" in both tools/include/nolibc and tools/testing/selftests/nolibc to make those two "[FAIL]" indications go away. Does this mean that I am doing something wrong? It would be good to know before I send the pull request containing these, so that we can let Linus know of anything special he needs to do to ensure a valid test result. Thanx, Paul > --- > tools/testing/selftests/nolibc/nolibc-test.c | 7 +++++++ > 1 file changed, 7 insertions(+) > > diff --git a/tools/testing/selftests/nolibc/nolibc-test.c b/tools/testing/selftests/nolibc/nolibc-test.c > index 78bced95ac63..f14f5076fb6d 100644 > --- a/tools/testing/selftests/nolibc/nolibc-test.c > +++ b/tools/testing/selftests/nolibc/nolibc-test.c > @@ -565,6 +565,13 @@ int run_stdlib(int min, int max) > CASE_TEST(strchr_foobar_z); EXPECT_STRZR(1, strchr("foobar", 'z')); break; > CASE_TEST(strrchr_foobar_o); EXPECT_STREQ(1, strrchr("foobar", 'o'), "obar"); break; > CASE_TEST(strrchr_foobar_z); EXPECT_STRZR(1, strrchr("foobar", 'z')); break; > + CASE_TEST(memcmp_20_20); EXPECT_EQ(1, memcmp("aaa\x20", "aaa\x20", 4), 0); break; > + CASE_TEST(memcmp_20_60); EXPECT_LT(1, memcmp("aaa\x20", "aaa\x60", 4), 0); break; > + CASE_TEST(memcmp_60_20); EXPECT_GT(1, memcmp("aaa\x60", "aaa\x20", 4), 0); break; > + CASE_TEST(memcmp_20_e0); EXPECT_LT(1, memcmp("aaa\x20", "aaa\xe0", 4), 0); break; > + CASE_TEST(memcmp_e0_20); EXPECT_GT(1, memcmp("aaa\xe0", "aaa\x20", 4), 0); break; > + CASE_TEST(memcmp_80_e0); EXPECT_LT(1, memcmp("aaa\x80", "aaa\xe0", 4), 0); break; > + CASE_TEST(memcmp_e0_80); EXPECT_GT(1, memcmp("aaa\xe0", "aaa\x80", 4), 0); break; > case __LINE__: > return ret; /* must be last */ > /* note: do not set any defaults so as to permit holes above */ > -- > 2.17.5 >