Fix localedef collation handling of <U0000> (bug 15948).
authorRichard Sandiford <richard@codesourcery.com>
Fri, 18 Oct 2013 20:58:31 +0000 (20:58 +0000)
committerJoseph Myers <joseph@codesourcery.com>
Fri, 18 Oct 2013 20:58:31 +0000 (20:58 +0000)
ChangeLog
NEWS
locale/programs/ld-collate.c

index c9fd07d..1078b35 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+2013-10-18  Richard Sandiford  <richard@codesourcery.com>
+           Joseph Myers  <joseph@codesourcery.com
+
+       [BZ #15948]
+       * locale/programs/ld-collate.c (new_element): Handle <U0000> as a
+       single character.
+       (add_to_tablewc): Assert sequence of wide characters is nonempty.
+
 2013-10-18  Siddhesh Poyarekar  <siddhesh@redhat.com>
 
        * elf/tst-tls-dlinfo.c: Don't include tls.h.
diff --git a/NEWS b/NEWS
index 0efdde5..212859c 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -14,9 +14,9 @@ Version 2.19
   15609, 15610, 15632, 15640, 15672, 15680, 15681, 15723, 15734, 15735,
   15736, 15748, 15749, 15754, 15760, 15764, 15797, 15844, 15847, 15849,
   15855, 15856, 15857, 15859, 15867, 15886, 15887, 15890, 15892, 15893,
-  15895, 15897, 15905, 15909, 15919, 15921, 15923, 15939, 15963, 15966,
-  15895, 15897, 15905, 15909, 15919, 15921, 15923, 15939, 15963, 15966,
-  15988, 16032, 16034, 16036, 16041.
+  15895, 15897, 15905, 15909, 15919, 15921, 15923, 15939, 15948, 15963,
+  15966, 15895, 15897, 15905, 15909, 15919, 15921, 15923, 15939, 15963,
+  15966, 15988, 16032, 16034, 16036, 16041.
 
 * CVE-2012-4412 The strcoll implementation caches indices and rules for
   large collation sequences to optimize multiple passes.  This cache
index d88a6de..f7ae097 100644 (file)
@@ -352,6 +352,9 @@ new_element (struct locale_collate_t *collate, const char *mbs, size_t mbslen,
     {
       size_t nwcs = wcslen ((wchar_t *) wcs);
       uint32_t zero = 0;
+      /* Handle <U0000> as a single character.  */
+      if (nwcs == 0)
+       nwcs = 1;
       obstack_grow (&collate->mempool, wcs, nwcs * sizeof (uint32_t));
       obstack_grow (&collate->mempool, &zero, sizeof (uint32_t));
       newp->wcs = (uint32_t *) obstack_finish (&collate->mempool);
@@ -2078,6 +2081,7 @@ add_to_tablewc (uint32_t ch, struct element_t *runp)
              weightidx = output_weightwc (atwc.weightpool, atwc.collate,
                                           runp);
 
+             assert (runp->nwcs > 0);
              added = (1 + 1 + runp->nwcs - 1) * sizeof (int32_t);
              if (sizeof (int) == sizeof (int32_t))
                obstack_make_room (atwc.extrapool, added);