# HG changeset patch # User Bruno Haible # Date 1536780642 -7200 # Node ID 0a3b537c0ef03e8109295556e757df389dd48484 # Parent 7e5ce9b777a1d4d5913c786386bd6513538f8500 Apply Eric Blake's improvements from 2011-02-25 to more tests. * tests/test-c-strstr.c (main): Add the same tests here as well. diff -r 7e5ce9b777a1 -r 0a3b537c0ef0 ChangeLog --- a/ChangeLog Wed Sep 12 21:27:52 2018 +0200 +++ b/ChangeLog Wed Sep 12 21:30:42 2018 +0200 @@ -1,3 +1,8 @@ +2018-09-12 Bruno Haible + + Apply Eric Blake's improvements from 2011-02-25 to more tests. + * tests/test-c-strstr.c (main): Add the same tests here as well. + 2018-09-12 Bruno Haible Apply Jim Meyering's fix from 2015-01-11 to more tests. diff -r 7e5ce9b777a1 -r 0a3b537c0ef0 tests/test-c-strstr.c --- a/tests/test-c-strstr.c Wed Sep 12 21:27:52 2018 +0200 +++ b/tests/test-c-strstr.c Wed Sep 12 21:30:42 2018 +0200 @@ -123,5 +123,94 @@ free (haystack); } + { + /* Ensure that with a barely periodic "short" needle, c_strstr's + search does not mistakenly skip just past the match point. + This use of c_strstr would mistakenly return NULL before + gnulib v0.0-4927. */ + const char *haystack = + "\n" + "with_build_libsubdir\n" + "with_local_prefix\n" + "with_gxx_include_dir\n" + "with_cpp_install_dir\n" + "enable_generated_files_in_srcdir\n" + "with_gnu_ld\n" + "with_ld\n" + "with_demangler_in_ld\n" + "with_gnu_as\n" + "with_as\n" + "enable_largefile\n" + "enable_werror_always\n" + "enable_checking\n" + "enable_coverage\n" + "enable_gather_detailed_mem_stats\n" + "enable_build_with_cxx\n" + "with_stabs\n" + "enable_multilib\n" + "enable___cxa_atexit\n" + "enable_decimal_float\n" + "enable_fixed_point\n" + "enable_threads\n" + "enable_tls\n" + "enable_objc_gc\n" + "with_dwarf2\n" + "enable_shared\n" + "with_build_sysroot\n" + "with_sysroot\n" + "with_specs\n" + "with_pkgversion\n" + "with_bugurl\n" + "enable_languages\n" + "with_multilib_list\n"; + const char *needle = "\n" + "with_gnu_ld\n"; + const char* p = c_strstr (haystack, needle); + ASSERT (p - haystack == 114); + } + + { + /* Same bug, shorter trigger. */ + const char *haystack = "..wi.d."; + const char *needle = ".d."; + const char* p = c_strstr (haystack, needle); + ASSERT (p - haystack == 4); + } + + { + /* Like the above, but trigger the flaw in two_way_long_needle + by using a needle of length LONG_NEEDLE_THRESHOLD (32) or greater. + Rather than trying to find the right alignment manually, I've + arbitrarily chosen the following needle and template for the + haystack, and ensure that for each placement of the needle in + that haystack, c_strstr finds it. */ + const char *needle = "\nwith_gnu_ld-extend-to-len-32-b\n"; + const char *h = + "\n" + "with_build_libsubdir\n" + "with_local_prefix\n" + "with_gxx_include_dir\n" + "with_cpp_install_dir\n" + "with_e_\n" + "..............................\n" + "with_FGHIJKLMNOPQRSTUVWXYZ\n" + "with_567890123456789\n" + "with_multilib_list\n"; + size_t h_len = strlen (h); + char *haystack = malloc (h_len + 1); + size_t i; + ASSERT (haystack); + for (i = 0; i < h_len - strlen (needle); i++) + { + const char *p; + memcpy (haystack, h, h_len + 1); + memcpy (haystack + i, needle, strlen (needle) + 1); + p = c_strstr (haystack, needle); + ASSERT (p); + ASSERT (p - haystack == i); + } + free (haystack); + } + return 0; }