diff options
author | Richard Sandiford <richard@codesourcery.com> | 2013-10-18 20:58:31 +0000 |
---|---|---|
committer | Joseph Myers <joseph@codesourcery.com> | 2013-10-18 20:58:31 +0000 |
commit | 5abe0682337db0aa15e2adf027d10e5b75b31c5a (patch) | |
tree | c2851d5985a8401d4e134d8a173e717f706ca25e | |
parent | c7738d0822fd34e95ebf01ce8fa8ea397bc4843d (diff) | |
download | glibc-5abe0682337db0aa15e2adf027d10e5b75b31c5a.tar.gz glibc-5abe0682337db0aa15e2adf027d10e5b75b31c5a.tar.xz glibc-5abe0682337db0aa15e2adf027d10e5b75b31c5a.zip |
Fix localedef collation handling of <U0000> (bug 15948).
-rw-r--r-- | ChangeLog | 8 | ||||
-rw-r--r-- | NEWS | 6 | ||||
-rw-r--r-- | locale/programs/ld-collate.c | 4 |
3 files changed, 15 insertions, 3 deletions
diff --git a/ChangeLog b/ChangeLog index c9fd07dee8..1078b357cb 100644 --- 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 0efdde5561..212859c2dd 100644 --- 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 diff --git a/locale/programs/ld-collate.c b/locale/programs/ld-collate.c index d88a6de56e..f7ae09792a 100644 --- a/locale/programs/ld-collate.c +++ b/locale/programs/ld-collate.c @@ -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); |