diff options
-rw-r--r-- | ChangeLog | 8 | ||||
-rw-r--r-- | string/stratcliff.c | 144 | ||||
-rw-r--r-- | sysdeps/x86_64/strcmp.S | 32 | ||||
-rw-r--r-- | wcsmbs/wcsatcliff.c | 2 |
4 files changed, 133 insertions, 53 deletions
diff --git a/ChangeLog b/ChangeLog index 5b364114a9..08e448c309 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +2010-10-03 Ulrich Drepper <drepper@gmail.com> + + [BZ #12077] + * sysdeps/x86_64/strcmp.S: Fix handling of remaining bytes in buffer + for strncmp and strncasecmp. + * string/stratcliff.c: Add tests for strcmp and strncmp. + * wcsmbs/wcsatcliff.c: Adjust for stratcliff change. + 2010-06-02 Kirill A. Shutemov <kirill@shutemov.name> * elf/dl-reloc.c: Flush cache after solving TEXTRELs if arch diff --git a/string/stratcliff.c b/string/stratcliff.c index 2bb59820f9..5165be2d13 100644 --- a/string/stratcliff.c +++ b/string/stratcliff.c @@ -1,5 +1,6 @@ /* Test for string function add boundaries of usable memory. - Copyright (C) 1996,1997,1999-2003,2007, 2009 Free Software Foundation, Inc. + Copyright (C) 1996,1997,1999-2003,2007,2009,2010 + Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996. @@ -47,6 +48,8 @@ # define MEMCPY memcpy # define MEMPCPY mempcpy # define MEMCHR memchr +# define STRCMP strcmp +# define STRNCMP strncmp #endif @@ -70,12 +73,12 @@ do_test (void) if (adr == MAP_FAILED || dest == MAP_FAILED) { if (errno == ENOSYS) - puts ("No test, mmap not available."); + puts ("No test, mmap not available."); else - { - printf ("mmap failed: %m"); - result = 1; - } + { + printf ("mmap failed: %m"); + result = 1; + } } else { @@ -93,8 +96,8 @@ do_test (void) /* strlen/wcslen test */ for (outer = nchars - 1; outer >= MAX (0, nchars - 128); --outer) - { - for (inner = MAX (outer, nchars - 64); inner < nchars; ++inner) + { + for (inner = MAX (outer, nchars - 64); inner < nchars; ++inner) { adr[inner] = L('\0'); @@ -107,12 +110,12 @@ do_test (void) adr[inner] = L('T'); } - } + } /* strnlen/wcsnlen test */ for (outer = nchars; outer >= MAX (0, nchars - 128); --outer) - { - for (inner = MAX (outer, nchars - 64); inner < nchars; ++inner) + { + for (inner = MAX (outer, nchars - 64); inner < nchars; ++inner) { adr[inner] = L('\0'); @@ -126,9 +129,9 @@ do_test (void) adr[inner] = L('T'); } - } + } for (outer = nchars; outer >= MAX (0, nchars - 128); --outer) - { + { for (inner = MAX (outer, nchars - 64); inner <= nchars; ++inner) { if (STRNLEN (&adr[outer], inner - outer) @@ -139,11 +142,11 @@ do_test (void) result = 1; } } - } + } /* strchr/wcschr test */ for (outer = nchars - 1; outer >= MAX (0, nchars - 128); --outer) - { + { for (middle = MAX (outer, nchars - 64); middle < nchars; ++middle) { for (inner = middle; inner < nchars; ++inner) @@ -167,7 +170,7 @@ do_test (void) adr[middle] = L('T'); } } - } + } /* Special test. */ adr[nchars - 1] = L('\0'); @@ -180,7 +183,7 @@ do_test (void) /* strrchr/wcsrchr test */ for (outer = nchars - 1; outer >= MAX (0, nchars - 128); --outer) - { + { for (middle = MAX (outer, nchars - 64); middle < nchars; ++middle) { for (inner = middle; inner < nchars; ++inner) @@ -204,11 +207,11 @@ do_test (void) adr[middle] = L('T'); } } - } + } /* memchr test */ for (outer = nchars - 1; outer >= MAX (0, nchars - 128); --outer) - { + { for (middle = MAX (outer, nchars - 64); middle < nchars; ++middle) { adr[middle] = L('V'); @@ -224,9 +227,9 @@ do_test (void) adr[middle] = L('T'); } - } + } for (outer = nchars; outer >= MAX (0, nchars - 128); --outer) - { + { CHAR *cp = MEMCHR (&adr[outer], L('V'), nchars - outer); if (cp != NULL) @@ -235,13 +238,13 @@ do_test (void) STRINGIFY (MEMCHR), outer); result = 1; } - } + } /* This function only exists for single-byte characters. */ #ifndef WCSTEST /* rawmemchr test */ for (outer = nchars - 1; outer >= MAX (0, nchars - 128); --outer) - { + { for (middle = MAX (outer, nchars - 64); middle < nchars; ++middle) { adr[middle] = L('V'); @@ -257,13 +260,13 @@ do_test (void) adr[middle] = L('T'); } - } + } #endif /* strcpy/wcscpy test */ for (outer = nchars - 1; outer >= MAX (0, nchars - 128); --outer) - { - for (inner = MAX (outer, nchars - 64); inner < nchars; ++inner) + { + for (inner = MAX (outer, nchars - 64); inner < nchars; ++inner) { adr[inner] = L('\0'); @@ -277,7 +280,74 @@ do_test (void) adr[inner] = L('T'); } - } + } + + /* strcmp/wcscmp tests */ + for (outer = 1; outer < 32; ++outer) + for (middle = 0; middle < 16; ++middle) + { + MEMSET (adr + middle, L('T'), 256); + adr[256] = L('\0'); + MEMSET (dest + nchars - outer, L('T'), outer - 1); + dest[nchars - 1] = L('\0'); + + if (STRCMP (adr + middle, dest + nchars - outer) <= 0) + { + printf ("%s 1 flunked for outer = %d, middle = %d\n", + STRINGIFY (STRCMP), outer, middle); + result = 1; + } + + if (STRCMP (dest + nchars - outer, adr + middle) >= 0) + { + printf ("%s 2 flunked for outer = %d, middle = %d\n", + STRINGIFY (STRCMP), outer, middle); + result = 1; + } + } + + /* strncmp/wcsncmp tests */ + for (outer = 1; outer < 32; ++outer) + for (middle = 0; middle < 16; ++middle) + { + MEMSET (adr + middle, L('T'), 256); + adr[256] = L('\0'); + MEMSET (dest + nchars - outer, L('T'), outer - 1); + dest[nchars - 1] = L('U'); + + for (inner = 0; inner < outer; ++inner) + { + if (STRNCMP (adr + middle, dest + nchars - outer, inner) != 0) + { + printf ("%s 1 flunked for outer = %d, middle = %d, " + "inner = %d\n", + STRINGIFY (STRNCMP), outer, middle, inner); + result = 1; + } + + if (STRNCMP (dest + nchars - outer, adr + middle, inner) != 0) + { + printf ("%s 2 flunked for outer = %d, middle = %d, " + "inner = %d\n", + STRINGIFY (STRNCMP), outer, middle, inner); + result = 1; + } + } + + if (STRNCMP (adr + middle, dest + nchars - outer, outer) >= 0) + { + printf ("%s 1 flunked for outer = %d, middle = %d, full\n", + STRINGIFY (STRNCMP), outer, middle); + result = 1; + } + + if (STRNCMP (dest + nchars - outer, adr + middle, outer) <= 0) + { + printf ("%s 2 flunked for outer = %d, middle = %d, full\n", + STRINGIFY (STRNCMP), outer, middle); + result = 1; + } + } /* strncpy/wcsncpy tests */ adr[nchars - 1] = L('T'); @@ -295,12 +365,12 @@ do_test (void) result = 1; } } - } + } adr[nchars - 1] = L('\0'); for (outer = nchars - 1; outer >= MAX (0, nchars - 128); --outer) - { - for (inner = MAX (outer, nchars - 64); inner < nchars; ++inner) + { + for (inner = MAX (outer, nchars - 64); inner < nchars; ++inner) { size_t len; @@ -334,12 +404,12 @@ do_test (void) adr[inner] = L('T'); } - } + } /* stpcpy/wcpcpy test */ for (outer = nchars - 1; outer >= MAX (0, nchars - 128); --outer) - { - for (inner = MAX (outer, nchars - 64); inner < nchars; ++inner) + { + for (inner = MAX (outer, nchars - 64); inner < nchars; ++inner) { adr[inner] = L('\0'); @@ -352,7 +422,7 @@ do_test (void) adr[inner] = L('T'); } - } + } /* stpncpy/wcpncpy test */ adr[nchars - 1] = L('T'); @@ -374,8 +444,8 @@ do_test (void) adr[nchars - 1] = L('\0'); for (outer = nchars - 1; outer >= MAX (0, nchars - 128); --outer) - { - for (middle = MAX (outer, nchars - 64); middle < nchars; ++middle) + { + for (middle = MAX (outer, nchars - 64); middle < nchars; ++middle) { adr[middle] = L('\0'); @@ -393,7 +463,7 @@ do_test (void) adr[middle] = L('T'); } - } + } /* memcpy/wmemcpy test */ for (outer = nchars; outer >= MAX (0, nchars - 128); --outer) diff --git a/sysdeps/x86_64/strcmp.S b/sysdeps/x86_64/strcmp.S index 650ec173b6..e0847a201b 100644 --- a/sysdeps/x86_64/strcmp.S +++ b/sysdeps/x86_64/strcmp.S @@ -313,7 +313,7 @@ LABEL(nibble_ashr_1): jnz LABEL(ashr_1_exittail) /* find null char*/ #ifdef USE_AS_STRNCMP - cmp $14, %r11 + cmp $15, %r11 jbe LABEL(ashr_1_exittail) #endif @@ -438,7 +438,7 @@ LABEL(nibble_ashr_2): jnz LABEL(ashr_2_exittail) #ifdef USE_AS_STRNCMP - cmp $13, %r11 + cmp $14, %r11 jbe LABEL(ashr_2_exittail) #endif @@ -560,7 +560,7 @@ LABEL(nibble_ashr_3): jnz LABEL(ashr_3_exittail) #ifdef USE_AS_STRNCMP - cmp $12, %r11 + cmp $13, %r11 jbe LABEL(ashr_3_exittail) #endif @@ -682,7 +682,7 @@ LABEL(nibble_ashr_4): jnz LABEL(ashr_4_exittail) #ifdef USE_AS_STRNCMP - cmp $11, %r11 + cmp $12, %r11 jbe LABEL(ashr_4_exittail) #endif @@ -804,7 +804,7 @@ LABEL(nibble_ashr_5): jnz LABEL(ashr_5_exittail) #ifdef USE_AS_STRNCMP - cmp $10, %r11 + cmp $11, %r11 jbe LABEL(ashr_5_exittail) #endif @@ -926,7 +926,7 @@ LABEL(nibble_ashr_6): jnz LABEL(ashr_6_exittail) #ifdef USE_AS_STRNCMP - cmp $9, %r11 + cmp $10, %r11 jbe LABEL(ashr_6_exittail) #endif @@ -1048,7 +1048,7 @@ LABEL(nibble_ashr_7): jnz LABEL(ashr_7_exittail) #ifdef USE_AS_STRNCMP - cmp $8, %r11 + cmp $9, %r11 jbe LABEL(ashr_7_exittail) #endif @@ -1170,7 +1170,7 @@ LABEL(nibble_ashr_8): jnz LABEL(ashr_8_exittail) #ifdef USE_AS_STRNCMP - cmp $7, %r11 + cmp $8, %r11 jbe LABEL(ashr_8_exittail) #endif @@ -1292,7 +1292,7 @@ LABEL(nibble_ashr_9): jnz LABEL(ashr_9_exittail) #ifdef USE_AS_STRNCMP - cmp $6, %r11 + cmp $7, %r11 jbe LABEL(ashr_9_exittail) #endif @@ -1414,7 +1414,7 @@ LABEL(nibble_ashr_10): jnz LABEL(ashr_10_exittail) #ifdef USE_AS_STRNCMP - cmp $5, %r11 + cmp $6, %r11 jbe LABEL(ashr_10_exittail) #endif @@ -1536,7 +1536,7 @@ LABEL(nibble_ashr_11): jnz LABEL(ashr_11_exittail) #ifdef USE_AS_STRNCMP - cmp $4, %r11 + cmp $5, %r11 jbe LABEL(ashr_11_exittail) #endif @@ -1658,7 +1658,7 @@ LABEL(nibble_ashr_12): jnz LABEL(ashr_12_exittail) #ifdef USE_AS_STRNCMP - cmp $3, %r11 + cmp $4, %r11 jbe LABEL(ashr_12_exittail) #endif @@ -1780,7 +1780,7 @@ LABEL(nibble_ashr_13): jnz LABEL(ashr_13_exittail) #ifdef USE_AS_STRNCMP - cmp $2, %r11 + cmp $3, %r11 jbe LABEL(ashr_13_exittail) #endif @@ -1902,7 +1902,7 @@ LABEL(nibble_ashr_14): jnz LABEL(ashr_14_exittail) #ifdef USE_AS_STRNCMP - cmp $1, %r11 + cmp $2, %r11 jbe LABEL(ashr_14_exittail) #endif @@ -2026,8 +2026,8 @@ LABEL(nibble_ashr_15): jnz LABEL(ashr_15_exittail) #ifdef USE_AS_STRNCMP - test %r11, %r11 - je LABEL(ashr_15_exittail) + cmpq $1, %r11 + jbe LABEL(ashr_15_exittail) #endif pxor %xmm0, %xmm0 diff --git a/wcsmbs/wcsatcliff.c b/wcsmbs/wcsatcliff.c index b29571f294..95afff6098 100644 --- a/wcsmbs/wcsatcliff.c +++ b/wcsmbs/wcsatcliff.c @@ -16,6 +16,8 @@ #define MEMCPY wmemcpy #define MEMPCPY wmempcpy #define MEMCHR wmemchr +#define STRCMP wcscmp +#define STRNCMP wcsncmp #include "../string/stratcliff.c" |