Fix endless loop in mbmemcasecoll.
authorBruno Haible <bruno@clisp.org>
Wed, 22 Sep 2010 11:34:54 +0000 (13:34 +0200)
committerBruno Haible <bruno@clisp.org>
Wed, 22 Sep 2010 11:34:54 +0000 (13:34 +0200)
* lib/mbmemcasecoll.c (apply_towlower): When mbrtowc returns 0, copy 1
byte.
* tests/test-mbmemcasecmp.h (test_ascii): Test embedded NULs.

ChangeLog
lib/mbmemcasecoll.c
tests/test-mbmemcasecmp.h

index d7fa9ce..5d541b1 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+2010-09-22  Pádraig Brady  <P@draigbrady.com>
+            Bruno Haible  <bruno@clisp.org>
+
+       Fix endless loop in mbmemcasecoll.
+       * lib/mbmemcasecoll.c (apply_towlower): When mbrtowc returns 0, copy 1
+       byte.
+       * tests/test-mbmemcasecmp.h (test_ascii): Test embedded NULs.
+
 2010-09-22  Bruno Haible  <bruno@clisp.org>
 
        Tests for module 'memcoll'.
index b8248f9..6bb5bd6 100644 (file)
@@ -1,5 +1,5 @@
 /* Locale-specific case-ignoring memory comparison.
-   Copyright (C) 2001, 20092010 Free Software Foundation, Inc.
+   Copyright (C) 2001, 2009-2010 Free Software Foundation, Inc.
    Written by Bruno Haible <bruno@clisp.org>, 2001.
 
    This program is free software: you can redistribute it and/or modify it
@@ -61,8 +61,12 @@ apply_towlower (const char *inbuf, size_t inbufsize,
         break;
       if (n1 != (size_t)(-1))
         {
-          wint_t wc2 = towlower (wc1);
+          wint_t wc2;
 
+          if (n1 == 0) /* NUL character? */
+            n1 = 1;
+
+          wc2 = towlower (wc1);
           if (wc2 != wc1)
             {
               size_t n2;
index f41580d..180a831 100644 (file)
@@ -62,6 +62,12 @@ test_ascii (int (*my_casecmp) (const char *, size_t, const char *, size_t))
 
   ASSERT (my_casecmp ("para", 4, "paragraph", 9) < 0);
   ASSERT (my_casecmp ("paragraph", 9, "para", 4) > 0);
+
+  /* Embedded NULs.  */
+  ASSERT (my_casecmp ("1\0", 2, "2\0", 2) < 0);
+  ASSERT (my_casecmp ("2\0", 2, "1\0", 2) > 0);
+  ASSERT (my_casecmp ("x\0""1", 3, "x\0""2", 3) < 0);
+  ASSERT (my_casecmp ("x\0""2", 3, "x\0""1", 3) > 0);
 }
 
 static void