From 3e2b3547b415017f1eeec4a8483901a172bcd3cb Mon Sep 17 00:00:00 2001 From: Bruno Haible Date: Wed, 22 Sep 2010 13:34:54 +0200 Subject: [PATCH] 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. --- ChangeLog | 8 ++++++++ lib/mbmemcasecoll.c | 8 ++++++-- tests/test-mbmemcasecmp.h | 6 ++++++ 3 files changed, 20 insertions(+), 2 deletions(-) diff --git a/ChangeLog b/ChangeLog index d7fa9ced20..5d541b1635 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +2010-09-22 Pádraig Brady + Bruno Haible + + 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 Tests for module 'memcoll'. diff --git a/lib/mbmemcasecoll.c b/lib/mbmemcasecoll.c index b8248f90d7..6bb5bd6f0d 100644 --- a/lib/mbmemcasecoll.c +++ b/lib/mbmemcasecoll.c @@ -1,5 +1,5 @@ /* Locale-specific case-ignoring memory comparison. - Copyright (C) 2001, 2009, 2010 Free Software Foundation, Inc. + Copyright (C) 2001, 2009-2010 Free Software Foundation, Inc. Written by Bruno Haible , 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; diff --git a/tests/test-mbmemcasecmp.h b/tests/test-mbmemcasecmp.h index f41580dfe2..180a83150b 100644 --- a/tests/test-mbmemcasecmp.h +++ b/tests/test-mbmemcasecmp.h @@ -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 -- 2.30.2