diff options
author | Clément Lassieur <clement@lassieur.org> | 2017-04-11 22:59:44 +0200 |
---|---|---|
committer | Clément Lassieur <clement@lassieur.org> | 2017-04-17 20:41:16 +0200 |
commit | a408e757663a1f2cb075a9918bb49708906aaca4 (patch) | |
tree | 85e811165602b1ca5c5b1e50517be333b89ff564 /gnu/packages | |
parent | c04ef86e8114225f5e5859f379582ba6f69aacfb (diff) | |
download | gnu-guix-a408e757663a1f2cb075a9918bb49708906aaca4.tar gnu-guix-a408e757663a1f2cb075a9918bb49708906aaca4.tar.gz |
gnu: icu4c: Fix crashes in programs using system ICU.
Fixes <http://bugs.gnu.org/26462>.
* gnu/packages/patches/icu4c-reset-keyword-list-iterator.patch: New file.
* gnu/local.mk (dist_patch_DATA): Add it.
* gnu/packages/icu4c.scm (icu4c)[replacement]: New field.
(icu4c/fixed): New variable.
Diffstat (limited to 'gnu/packages')
-rw-r--r-- | gnu/packages/icu4c.scm | 11 | ||||
-rw-r--r-- | gnu/packages/patches/icu4c-reset-keyword-list-iterator.patch | 130 |
2 files changed, 141 insertions, 0 deletions
diff --git a/gnu/packages/icu4c.scm b/gnu/packages/icu4c.scm index d842f03b4e..2b51441002 100644 --- a/gnu/packages/icu4c.scm +++ b/gnu/packages/icu4c.scm @@ -2,6 +2,7 @@ ;;; Copyright © 2013 Andreas Enge <andreas@enge.fr> ;;; Copyright © 2015, 2016 Mark H Weaver <mhw@netris.org> ;;; Copyright © 2016 Efraim Flashner <efraim@flashner.co.il> +;;; Copyright © 2017 Clément Lassieur <clement@lassieur.org> ;;; ;;; This file is part of GNU Guix. ;;; @@ -30,6 +31,7 @@ (package (name "icu4c") (version "58.2") + (replacement icu4c/fixed) (source (origin (method url-fetch) (uri (string-append @@ -63,3 +65,12 @@ globalisation support for software applications. This package contains the C/C++ part.") (license x11) (home-page "http://site.icu-project.org/"))) + +(define icu4c/fixed + (package + (inherit icu4c) + (replacement #f) + (source (origin + (inherit (package-source icu4c)) + (patches + (search-patches "icu4c-reset-keyword-list-iterator.patch")))))) diff --git a/gnu/packages/patches/icu4c-reset-keyword-list-iterator.patch b/gnu/packages/patches/icu4c-reset-keyword-list-iterator.patch new file mode 100644 index 0000000000..17970aa4a8 --- /dev/null +++ b/gnu/packages/patches/icu4c-reset-keyword-list-iterator.patch @@ -0,0 +1,130 @@ +Copied from upstream: http://bugs.icu-project.org/trac/changeset/39484/. + +Fixes <http://bugs.gnu.org/26462> (crashes). + +Paths and line endings have been adapted. + +Index: icu/source/common/ulist.c +=================================================================== +--- icu/source/common/ulist.c (revision 39483) ++++ icu/source/common/ulist.c (revision 39484) +@@ -30,5 +30,4 @@ + + int32_t size; +- int32_t currentIndex; + }; + +@@ -52,5 +51,4 @@ + newList->tail = NULL; + newList->size = 0; +- newList->currentIndex = -1; + + return newList; +@@ -81,6 +79,7 @@ + p->next->previous = p->previous; + } +- list->curr = NULL; +- list->currentIndex = 0; ++ if (p == list->curr) { ++ list->curr = p->next; ++ } + --list->size; + if (p->forceDelete) { +@@ -151,5 +150,4 @@ + list->head->previous = newItem; + list->head = newItem; +- list->currentIndex++; + } + +@@ -194,5 +192,4 @@ + curr = list->curr; + list->curr = curr->next; +- list->currentIndex++; + + return curr->data; +@@ -210,5 +207,4 @@ + if (list != NULL) { + list->curr = list->head; +- list->currentIndex = 0; + } + } +@@ -273,3 +269,2 @@ + return (UList *)(en->context); + } +- +Index: icu/source/i18n/ucol_res.cpp +=================================================================== +--- icu/source/i18n/ucol_res.cpp (revision 39483) ++++ icu/source/i18n/ucol_res.cpp (revision 39484) +@@ -681,4 +681,5 @@ + } + memcpy(en, &defaultKeywordValues, sizeof(UEnumeration)); ++ ulist_resetList(sink.values); // Initialize the iterator. + en->context = sink.values; + sink.values = NULL; // Avoid deletion in the sink destructor. +Index: icu/source/test/intltest/apicoll.cpp +=================================================================== +--- icu/source/test/intltest/apicoll.cpp (revision 39483) ++++ icu/source/test/intltest/apicoll.cpp (revision 39484) +@@ -82,14 +82,7 @@ + col = Collator::createInstance(Locale::getEnglish(), success); + if (U_FAILURE(success)){ +- errcheckln(success, "Default Collator creation failed. - %s", u_errorName(success)); +- return; +- } +- +- StringEnumeration* kwEnum = col->getKeywordValuesForLocale("", Locale::getEnglish(),true,success); +- if (U_FAILURE(success)){ +- errcheckln(success, "Get Keyword Values for Locale failed. - %s", u_errorName(success)); +- return; +- } +- delete kwEnum; ++ errcheckln(success, "English Collator creation failed. - %s", u_errorName(success)); ++ return; ++ } + + col->getVersion(versionArray); +@@ -230,4 +223,27 @@ + delete aFrCol; + delete junk; ++} ++ ++void CollationAPITest::TestKeywordValues() { ++ IcuTestErrorCode errorCode(*this, "TestKeywordValues"); ++ LocalPointer<Collator> col(Collator::createInstance(Locale::getEnglish(), errorCode)); ++ if (errorCode.logIfFailureAndReset("English Collator creation failed")) { ++ return; ++ } ++ ++ LocalPointer<StringEnumeration> kwEnum( ++ col->getKeywordValuesForLocale("collation", Locale::getEnglish(), TRUE, errorCode)); ++ if (errorCode.logIfFailureAndReset("Get Keyword Values for English Collator failed")) { ++ return; ++ } ++ assertTrue("expect at least one collation tailoring for English", kwEnum->count(errorCode) > 0); ++ const char *kw; ++ UBool hasStandard = FALSE; ++ while ((kw = kwEnum->next(NULL, errorCode)) != NULL) { ++ if (strcmp(kw, "standard") == 0) { ++ hasStandard = TRUE; ++ } ++ } ++ assertTrue("expect at least the 'standard' collation tailoring for English", hasStandard); + } + +@@ -2467,4 +2483,5 @@ + TESTCASE_AUTO_BEGIN; + TESTCASE_AUTO(TestProperty); ++ TESTCASE_AUTO(TestKeywordValues); + TESTCASE_AUTO(TestOperators); + TESTCASE_AUTO(TestDuplicate); +Index: icu/source/test/intltest/apicoll.h +=================================================================== +--- icu/source/test/intltest/apicoll.h (revision 39483) ++++ icu/source/test/intltest/apicoll.h (revision 39484) +@@ -36,4 +36,5 @@ + */ + void TestProperty(/* char* par */); ++ void TestKeywordValues(); + + /** |