summaryrefslogtreecommitdiff
path: root/libre/icu-parabola
diff options
context:
space:
mode:
authorDenis 'GNUtoo' Carikli <GNUtoo@cyberdimension.org>2020-05-03 02:20:36 +0200
committerDenis 'GNUtoo' Carikli <GNUtoo@cyberdimension.org>2020-05-03 03:03:26 +0200
commit1ba48ddb002cfdad9503bb50c262a80819c48539 (patch)
treea29c9aaaff024f3f00c503c1848541b217c4280a /libre/icu-parabola
parente185ac2dea5af73b8dc65f71ad4519c0eeb6865f (diff)
downloadabslibre-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/PKGBUILD125
-rw-r--r--libre/icu-parabola/icu-65.1-initialized-buffer-uloc_getKeywordValue.patch23
-rw-r--r--libre/icu-parabola/icu-65.1-prevent-SEGV_MAPERR-in-append.patch118
-rw-r--r--libre/icu-parabola/icu-parabola.install7
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