diff options
author | Denis 'GNUtoo' Carikli <GNUtoo@cyberdimension.org> | 2020-05-03 02:20:36 +0200 |
---|---|---|
committer | Denis 'GNUtoo' Carikli <GNUtoo@cyberdimension.org> | 2020-05-03 03:03:26 +0200 |
commit | 1ba48ddb002cfdad9503bb50c262a80819c48539 (patch) | |
tree | a29c9aaaff024f3f00c503c1848541b217c4280a /libre/icu-parabola | |
parent | e185ac2dea5af73b8dc65f71ad4519c0eeb6865f (diff) | |
download | abslibre-1ba48ddb002cfdad9503bb50c262a80819c48539.tar.gz abslibre-1ba48ddb002cfdad9503bb50c262a80819c48539.tar.bz2 abslibre-1ba48ddb002cfdad9503bb50c262a80819c48539.zip |
libre: Add icu-parabola
Signed-off-by: Denis 'GNUtoo' Carikli <GNUtoo@cyberdimension.org>
Diffstat (limited to 'libre/icu-parabola')
-rw-r--r-- | libre/icu-parabola/PKGBUILD | 125 | ||||
-rw-r--r-- | libre/icu-parabola/icu-65.1-initialized-buffer-uloc_getKeywordValue.patch | 23 | ||||
-rw-r--r-- | libre/icu-parabola/icu-65.1-prevent-SEGV_MAPERR-in-append.patch | 118 | ||||
-rw-r--r-- | libre/icu-parabola/icu-parabola.install | 7 |
4 files changed, 273 insertions, 0 deletions
diff --git a/libre/icu-parabola/PKGBUILD b/libre/icu-parabola/PKGBUILD new file mode 100644 index 000000000..02050e006 --- /dev/null +++ b/libre/icu-parabola/PKGBUILD @@ -0,0 +1,125 @@ +# Maintainer (Arch): Andreas Radke <andyrtr@archlinux.org> +# Contributor (Arch): Art Gramlich <art@gramlich-net.com> +# Contributor (Parabola): Denis 'GNUtoo' Carikli <GNUtoo@cyberdimension.org> + +# parabola changes and rationale: +# Several Parabola packages depends on ICU, and the ICU soname changes often. +# +# This means that if we don't rebuild all the Parabola packages that depends +# on ICU as soon as the new Arch Linux, Arch Linux 32 and Arch Linux ARM ICU +# packages are synchronized into the Parabola repositories, we have an issue. +# +# At the time of writing, the synchronization is automatic and can happen at +# any time. +# +# At first nothing was done to fix or workaround that issue. In practice, +# once a new ICU was synchronized, many users were upgrading before the +# Parabola packages had the time to be rebuilt. For such users, it silently +# broke all the installed Parabola packages that were depending on the old ICU. +# This means that users had to find a way to downgrade packages manually or wait +# until developers would finally have rebuilt all the packages that were broken. +# +# Then such packages were modified to make them depend on the exact version of +# the ICU packages they were built against. This way, once the new ICU package +# was synchronized, users could not upgrade if they had packages that were not +# rebuilt yet against the new ICU packages as their dependencies could not be +# met anymore if the ICU would have been upgraded. +# However this workaround prevents installing packages that depends on the new +# ICU if you have packages that depends on the old ICU. It also prevent users +# from upgrading their system when that occurs. +# +# The correct fix would probably be to automatically build all the Packages +# instead of relying on Arch Linux Packages. The synchronization could then be +# done (semi-)automatically at a source level. +# +# However we don't have the code, configuration and/or infrastructure to run +# an automatic builder for all packages yet even if there is work in this +# direction. +# +# In the meantime, this version of ICU is meant to enable Parabola packages to +# link against it. This enables all the Parabola packages to depend only on this +# ICU version while the packages coming from upstream distributions would only +# depend on that distribution's ICU. +# +# The downside of this workaround is that it consumes more resources and it +# doesn't scale: If we want to avoid all the breakages introduced by that issue +# we would then need to have a Parabola version of all the dependencies of the +# Parabola packages, which has many issues: +# - It would increase the work of Parabola maintainers as we would need to +# manually sync with upstream and build the PKGBUILDs of each dependency. +# - Without compression or deduplication, such libraries would use twice the +# amount of storage, or even RAM if two programs depending on two different +# version of the library are running at the same time. +# +# So the idea is to only use it for libraries that often have this issue. +# +# Changes: +# - Changed the configure prefix (to enable both libraries to be installed in +# parallel) +# - Added icu-parabola.conf and a .install to run ldconfig after installation in +# order to take into account the path of this library version. + +pkgname=icu-parabola +_pkgname=icu +pkgver=65.1 +pkgrel=3 +pkgrel=1.parabola1 +pkgdesc="International Components for Unicode library" +arch=('armv7h' 'i686' 'x86_64') +url="http://site.icu-project.org/home" +license=('custom:icu') +depends=('gcc-libs' 'sh') +makedepends=('python') +#makedepends=('clang') +# no https available +source=(https://github.com/unicode-org/icu/releases/download/release-${pkgver//./-}/${_pkgname}4c-${pkgver//./_}-src.tgz{,.asc} + icu-65.1-initialized-buffer-uloc_getKeywordValue.patch::https://github.com/unicode-org/icu/commit/fab4c3c719.patch + icu-65.1-prevent-SEGV_MAPERR-in-append.patch::https://github.com/unicode-org/icu/commit/b7d08bc04a.patch) +install="${pkgname}.install" +# https://github.com/unicode-org/icu/releases/download/release-65-1/SHASUM512.txt +sha512sums=('8f1ef33e1f4abc9a8ee870331c59f01b473d6da1251a19ce403f822f3e3871096f0791855d39c8f20c612fc49cda2c62c06864aa32ddab2dbd186d2b21ce9139' + 'SKIP' + '8898fe0fa9805304cd2fc02c00ab1131861836f4d11887f82450c2378666cb03bce0c5038d3f0bdcdd1c1cdee2a00a61ef85602ed0e0c74ad2e58578b1940123' + '580283cdd95fb7b8410cb3a6c0f47a6c8e53e0fdc9c213b04cd133ba4120381533ff2aef89ddab968150754bd9ca3a536d5c592c6881e625eb8ee6de8723de1b') +validpgpkeys=('BA90283A60D67BA0DD910A893932080F4FB419E3') # "Steven R. Loomis (filfla-signing) <srloomis@us.ibm.com>" +validpgpkeys+=('9731166CD8E23A83BEE7C6D3ACA5DBE1FD8FABF1') # "Steven R. Loomis (ICU Project) <srl@icu-project.org>" +validpgpkeys+=('FFA9129A180D765B7A5BEA1C9B432B27D1BA20D7') # "Fredrik Roubert <fredrik@roubert.name>" +validpgpkeys+=('E4098B78AFC94394F3F49AA903996C7C83F12F11') # "keybase.io/srl295 <srl295@keybase.io>" + +prepare() { + cd icu + + # https://unicode-org.atlassian.net/browse/ICU-20884 + patch -Np2 -i ../icu-65.1-initialized-buffer-uloc_getKeywordValue.patch + + # https://github.com/unicode-org/icu/pull/971 + patch -Np2 -i ../icu-65.1-prevent-SEGV_MAPERR-in-append.patch + + # icu-parabola.conf will go in /etc/ld.so.conf.d + echo "/opt/parabola/icu/lib" > icu-parabola.conf +} + +build() { + cd icu/source + ./configure \ + --prefix=/opt/parabola/icu \ + --sbindir=/opt/parabola/icu/bin + make +} + +check() { + cd icu/source + make -k check +} + +package() { + cd icu/source + make -j1 DESTDIR="${pkgdir}" install + + # Add + install -d ${pkgdir}/etc/ld.so.conf.d/ + install -Dm644 "${srcdir}"/icu/icu-parabola.conf "${pkgdir}/etc/ld.so.conf.d/icu-parabola.conf" + + # Install license + install -Dm644 "${srcdir}"/icu/LICENSE "${pkgdir}/usr/share/licenses/${pkgname}/LICENSE" +} diff --git a/libre/icu-parabola/icu-65.1-initialized-buffer-uloc_getKeywordValue.patch b/libre/icu-parabola/icu-65.1-initialized-buffer-uloc_getKeywordValue.patch new file mode 100644 index 000000000..475921d23 --- /dev/null +++ b/libre/icu-parabola/icu-65.1-initialized-buffer-uloc_getKeywordValue.patch @@ -0,0 +1,23 @@ +From fab4c3c719977205a3f005ddfd7fffbb9c19c587 Mon Sep 17 00:00:00 2001 +From: Frank Tang <ftang@chromium.org> +Date: Wed, 30 Oct 2019 17:45:22 -0700 +Subject: [PATCH] ICU-20884 initialized buffer uloc_getKeywordValue + +--- + icu4c/source/common/uloc.cpp | 3 +++ + 1 file changed, 3 insertions(+) + +diff --git a/icu4c/source/common/uloc.cpp b/icu4c/source/common/uloc.cpp +index 6a9bfcfbff5..ea81c0ce87f 100644 +--- a/icu4c/source/common/uloc.cpp ++++ b/icu4c/source/common/uloc.cpp +@@ -766,6 +766,9 @@ uloc_getKeywordValue(const char* localeID, + char* buffer, int32_t bufferCapacity, + UErrorCode* status) + { ++ if (buffer != nullptr) { ++ buffer[0] = '\0'; ++ } + const char* startSearchHere = NULL; + const char* nextSeparator = NULL; + char keywordNameBuffer[ULOC_KEYWORD_BUFFER_LEN]; diff --git a/libre/icu-parabola/icu-65.1-prevent-SEGV_MAPERR-in-append.patch b/libre/icu-parabola/icu-65.1-prevent-SEGV_MAPERR-in-append.patch new file mode 100644 index 000000000..07b3db677 --- /dev/null +++ b/libre/icu-parabola/icu-65.1-prevent-SEGV_MAPERR-in-append.patch @@ -0,0 +1,118 @@ +From b7d08bc04a4296982fcef8b6b8a354a9e4e7afca Mon Sep 17 00:00:00 2001 +From: Frank Tang <ftang@chromium.org> +Date: Sat, 1 Feb 2020 02:39:04 +0000 +Subject: [PATCH] ICU-20958 Prevent SEGV_MAPERR in append + +See #971 +--- + icu4c/source/common/unistr.cpp | 6 ++- + icu4c/source/test/intltest/ustrtest.cpp | 62 +++++++++++++++++++++++++ + icu4c/source/test/intltest/ustrtest.h | 1 + + 3 files changed, 68 insertions(+), 1 deletion(-) + +diff --git a/icu4c/source/common/unistr.cpp b/icu4c/source/common/unistr.cpp +index 901bb3358ba..077b4d6ef20 100644 +--- a/icu4c/source/common/unistr.cpp ++++ b/icu4c/source/common/unistr.cpp +@@ -1563,7 +1563,11 @@ UnicodeString::doAppend(const UChar *srcChars, int32_t srcStart, int32_t srcLeng + } + + int32_t oldLength = length(); +- int32_t newLength = oldLength + srcLength; ++ int32_t newLength; ++ if (uprv_add32_overflow(oldLength, srcLength, &newLength)) { ++ setToBogus(); ++ return *this; ++ } + + // Check for append onto ourself + const UChar* oldArray = getArrayStart(); +diff --git a/icu4c/source/test/intltest/ustrtest.cpp b/icu4c/source/test/intltest/ustrtest.cpp +index b6515ea813c..ad38bdf53a3 100644 +--- a/icu4c/source/test/intltest/ustrtest.cpp ++++ b/icu4c/source/test/intltest/ustrtest.cpp +@@ -67,6 +67,7 @@ void UnicodeStringTest::runIndexedTest( int32_t index, UBool exec, const char* & + TESTCASE_AUTO(TestWCharPointers); + TESTCASE_AUTO(TestNullPointers); + TESTCASE_AUTO(TestUnicodeStringInsertAppendToSelf); ++ TESTCASE_AUTO(TestLargeAppend); + TESTCASE_AUTO_END; + } + +@@ -2310,3 +2311,64 @@ void UnicodeStringTest::TestUnicodeStringInsertAppendToSelf() { + str.insert(2, sub); + assertEquals("", u"abbcdcde", str); + } ++ ++void UnicodeStringTest::TestLargeAppend() { ++ if(quick) return; ++ ++ IcuTestErrorCode status(*this, "TestLargeAppend"); ++ // Make a large UnicodeString ++ int32_t len = 0xAFFFFFF; ++ UnicodeString str; ++ char16_t *buf = str.getBuffer(len); ++ // A fast way to set buffer to valid Unicode. ++ // 4E4E is a valid unicode character ++ uprv_memset(buf, 0x4e, len * 2); ++ str.releaseBuffer(len); ++ UnicodeString dest; ++ // Append it 16 times ++ // 0xAFFFFFF times 16 is 0xA4FFFFF1, ++ // which is greater than INT32_MAX, which is 0x7FFFFFFF. ++ int64_t total = 0; ++ for (int32_t i = 0; i < 16; i++) { ++ dest.append(str); ++ total += len; ++ if (total <= INT32_MAX) { ++ assertFalse("dest is not bogus", dest.isBogus()); ++ } else { ++ assertTrue("dest should be bogus", dest.isBogus()); ++ } ++ } ++ dest.remove(); ++ total = 0; ++ for (int32_t i = 0; i < 16; i++) { ++ dest.append(str); ++ total += len; ++ if (total + len <= INT32_MAX) { ++ assertFalse("dest is not bogus", dest.isBogus()); ++ } else if (total <= INT32_MAX) { ++ // Check that a string of exactly the maximum size works ++ UnicodeString str2; ++ int32_t remain = INT32_MAX - total; ++ char16_t *buf2 = str2.getBuffer(remain); ++ if (buf2 == nullptr) { ++ // if somehow memory allocation fail, return the test ++ return; ++ } ++ uprv_memset(buf2, 0x4e, remain * 2); ++ str2.releaseBuffer(remain); ++ dest.append(str2); ++ total += remain; ++ assertEquals("When a string of exactly the maximum size works", (int64_t)INT32_MAX, total); ++ assertEquals("When a string of exactly the maximum size works", INT32_MAX, dest.length()); ++ assertFalse("dest is not bogus", dest.isBogus()); ++ ++ // Check that a string size+1 goes bogus ++ str2.truncate(1); ++ dest.append(str2); ++ total++; ++ assertTrue("dest should be bogus", dest.isBogus()); ++ } else { ++ assertTrue("dest should be bogus", dest.isBogus()); ++ } ++ } ++} +diff --git a/icu4c/source/test/intltest/ustrtest.h b/icu4c/source/test/intltest/ustrtest.h +index 218befdcc68..4a356a92c7a 100644 +--- a/icu4c/source/test/intltest/ustrtest.h ++++ b/icu4c/source/test/intltest/ustrtest.h +@@ -97,6 +97,7 @@ class UnicodeStringTest: public IntlTest { + void TestWCharPointers(); + void TestNullPointers(); + void TestUnicodeStringInsertAppendToSelf(); ++ void TestLargeAppend(); + }; + + #endif diff --git a/libre/icu-parabola/icu-parabola.install b/libre/icu-parabola/icu-parabola.install new file mode 100644 index 000000000..0dfc97820 --- /dev/null +++ b/libre/icu-parabola/icu-parabola.install @@ -0,0 +1,7 @@ +post_install() { + ldconfig +} + +post_upgrade() { + ldconfig +}
\ No newline at end of file |