]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
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 c9fd07dee8253e3b6b40cdb7afb40dc8a6c8f406..1078b357cb4fd2d193a472fca9a0fe7bd17b54ac 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 0efdde5561eaa3ba5141338b2e66532ce90b23e7..212859c2ddf43194f693ba13360ee27a4d567c36 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 d88a6de56e6403d2554a184acfbedf4ad56197a8..f7ae09792a206b4502eeefe85770f08b5462c489 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);