summaryrefslogtreecommitdiff
path: root/libre
diff options
context:
space:
mode:
authorEli Schwartz <eschwartz@archlinux.org>2020-05-04 12:48:34 -0400
committerDenis 'GNUtoo' Carikli <GNUtoo@cyberdimension.org>2020-05-04 20:58:35 +0200
commit7c37754b1c8a1a71f94932c484c4fd2299caa768 (patch)
treeb714a9d4923a151e179d44fe30a8288466ff80b5 /libre
parentafc15703678cda346910f9ffe487253e40acede9 (diff)
downloadabslibre-7c37754b1c8a1a71f94932c484c4fd2299caa768.tar.gz
abslibre-7c37754b1c8a1a71f94932c484c4fd2299caa768.tar.bz2
abslibre-7c37754b1c8a1a71f94932c484c4fd2299caa768.zip
icu-parabola: convert to install in /usr/lib and not conflict with icu
Following the same pattern as some AUR packages (icu65 and so on), make this package just provide compat libs. There's no need to try building packages against an old icu version, we just want to make sure programs which are linked to an older libicu*.so can use it. The libprovides recently added in Arch Linux are introduced as well. They won't break anything, they simply add another way to depend on this package, which is more convenient than the current use in package() functions of: local _icu_ver _icu_ver=$(pacman -S --print-format='%v' icu) depends+=("icu>=${_icu_ver}" "icu<$((${_icu_ver%%.*} + 1))") (which has other problems, like not being the version which is built against, but rather the version that a pacman -S icu would install or upgrade to -- partial upgrades are bad, but that doesn't mean break it if someone does so) Expected use of this package: depends+=('icu' 'libicui18n.so') ... added to a Parabola package which uses icu, to make it depend on the Arch icu package (and ensure it is preferred in all cases) and additionally to depend on any package providing the correct version of the libicu*.so dependent libraries. If all goes well, the icu package will be pulled in as a dependency. If all doesn't go well, then packages fall back on additionally installing this package for compatibility purposes, and all still goes well. Signed-off-by: Eli Schwartz <eschwartz@archlinux.org> Signed-off-by: Denis 'GNUtoo' Carikli <GNUtoo@cyberdimension.org>
Diffstat (limited to 'libre')
-rw-r--r--libre/icu-parabola/PKGBUILD52
-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
3 files changed, 173 insertions, 20 deletions
diff --git a/libre/icu-parabola/PKGBUILD b/libre/icu-parabola/PKGBUILD
index df7f991c8..3763c73ae 100644
--- a/libre/icu-parabola/PKGBUILD
+++ b/libre/icu-parabola/PKGBUILD
@@ -53,45 +53,56 @@
# So the idea is to only use it for libraries that often have this issue.
#
# Changes:
-# - Changed the configure prefix (to allow both sets of libraries to be co-exist)
-# - Added icu-parabola.conf and a .install to run ldconfig after installation in
-# order to take into account the path of this library version.
+# - remove all files other than libicu*.so.*
+# - depend on icu; this is needed because if the package is installed on its
+# own, ldconfig will create untracked symlinks which were supposed to be
+# installed by the icu package.
pkgname=icu-parabola
_pkgname=icu
-pkgver=67.1
-pkgrel=1
+pkgver=65.1
+pkgrel=3
pkgrel+=.parabola2
pkgdesc="International Components for Unicode library"
+pkgdesc+=" (compatibility libraries for the previous release)"
arch=(x86_64)
arch+=(armv7h i686)
url="http://site.icu-project.org/home"
license=('custom:icu')
depends=('gcc-libs' 'sh')
+depends+=('icu')
makedepends=('python')
-# provides=(libicu{data,i18n,io,test,tu,uc}.so) # TODO: is this needed - or will it break stuff?
-source=(https://github.com/unicode-org/icu/releases/download/release-${pkgver//./-}/${_pkgname}4c-${pkgver//./_}-src.tgz{,.asc})
+provides=(libicu{data,i18n,io,test,tu,uc}.so)
+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)
# https://github.com/unicode-org/icu/releases/download/release-65-1/SHASUM512.txt - no checksum file for v67 release
-sha512sums=('4779f1ce1ca7976f6fad6768853ea8c540da54d11509e3b6cfd864a04b5f2db1c3d4b546387f91ad02fb90804525bc37d2543173f0d705d6ca11dc6f2b7640a8'
- 'SKIP')
-validpgpkeys=('BA90283A60D67BA0DD910A893932080F4FB419E3') # "Steven R. Loomis (filfla-signing) <srloomis@us.ibm.com>"
-validpgpkeys+=('9731166CD8E23A83BEE7C6D3ACA5DBE1FD8FABF1') # "Steven R. Loomis (ICU Project) <srl@icu-project.org>"
+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>"
-validpgpkeys=('4569BBC09DA846FC91CBD21CE1BBA44593CF2AE0') # "Steven R. Loomis (codesign-qormi) <srloomis@us.ibm.com>"
+validpgpkeys+=('4569BBC09DA846FC91CBD21CE1BBA44593CF2AE0') # "Steven R. Loomis (codesign-qormi) <srloomis@us.ibm.com>"
prepare() {
cd icu
- # icu-parabola.conf will go in /etc/ld.so.conf.d
- echo "/opt/parabola/icu/lib" > icu-parabola.conf
+ # 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
}
build() {
cd icu/source
- ./configure --prefix=/opt/parabola/icu \
+ ./configure --prefix=/usr \
+ --sysconfdir=/etc \
--mandir=/usr/share/man \
- --sbindir=/opt/parabola/icu/bin
+ --sbindir=/usr/bin
make
}
@@ -104,10 +115,11 @@ 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"
+
+ # to avoid conflicts against the preferred 'icu' package, we remove all files
+ # except the actual shared libraries
+ rm -r "${pkgdir}"/usr/{bin,include,lib/{icu,pkgconfig},share}
+ rm "${pkgdir}"/usr/lib/*.so
}
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