--- Begin Message ---
Package: release.debian.org
User: release.debian....@packages.debian.org
Tags: buster
Severity: normal
Hi RMs,
ICU had a non-standard tool for revealing its headers and libs paths,
compiler switches needed for development. This tool, icu-config, was
removed after being deprecated over pkg-config for years. Then another
ICU tool, pkgdata remained to use that [1]. It seems some projects
still didn't switch to pkg-config but use the mentioned ICU one.
There's an upstream fix for this, included in newer ICU releases -
meaning it's proven in Bullseye and Sid as well.
The only packaging change following this, pkg-data became a dependency
for icu-devtools due to its usage in pkgdata.
[ Reason ]
ICU tool pkgdata still would like to get headers and library data via
its removed icu-config. Upstream fixed it for newer ICU releases to
use pkg-config instead.
[ Impact ]
Code that compiles with ICU and uses pkgdata to reveal its headers and
libraries will work again.
[ Tests ]
Local tests and problem reporter confirmed the fix. It's also part of
Bullseye and Sid versions of ICU, working correctly.
[ Risks ]
None.
[ Checklist ]
[x] all changes are documented in the d/changelog
[x] I reviewed all changes and I approve them
[x] attach debdiff against the package in buster
[x] the issue is verified as fixed in unstable
Thanks for considering,
Laszlo/GCS
[1] https://bugs.debian.org/992591
diff -Nru icu-63.1/debian/changelog icu-63.1/debian/changelog
--- icu-63.1/debian/changelog 2020-03-13 19:49:33.000000000 +0100
+++ icu-63.1/debian/changelog 2021-08-21 07:28:38.000000000 +0200
@@ -1,3 +1,13 @@
+icu (63.1-6+deb10u2) buster; urgency=medium
+
+ * Add pkg-config dependency to icu-devtools.
+
+ [ Scott Talbert <s...@techie.net> ]
+ * Backport upstream fix for pkgdata to work without icu-config
+ (closes: #992591).
+
+ -- Laszlo Boszormenyi (GCS) <g...@debian.org> Sat, 21 Aug 2021 07:28:38 +0200
+
icu (63.1-6+deb10u1) buster-security; urgency=high
* Backport upstream security fix for CVE-2020-10531: SEGV_MAPERR in
diff -Nru icu-63.1/debian/control icu-63.1/debian/control
--- icu-63.1/debian/control 2019-01-23 17:51:20.000000000 +0100
+++ icu-63.1/debian/control 2021-08-21 07:28:38.000000000 +0200
@@ -51,7 +51,7 @@
Architecture: any
Multi-Arch: foreign
Pre-Depends: ${misc:Pre-Depends}
-Depends: ${misc:Depends}, ${shlibs:Depends}
+Depends: ${misc:Depends}, ${shlibs:Depends}, pkg-config
Replaces: libicu-dev (<< ${binary:Version}), icu-tools (<< 63.1-1~)
Breaks: libicu-dev (<< ${binary:Version}), icu-tools (<< 63.1-1~)
Description: Development utilities for International Components for Unicode
diff -Nru icu-63.1/debian/patches/ICU-20924-Use-pkg-config-to-generate-the-path-to-pkg.patch icu-63.1/debian/patches/ICU-20924-Use-pkg-config-to-generate-the-path-to-pkg.patch
--- icu-63.1/debian/patches/ICU-20924-Use-pkg-config-to-generate-the-path-to-pkg.patch 1970-01-01 01:00:00.000000000 +0100
+++ icu-63.1/debian/patches/ICU-20924-Use-pkg-config-to-generate-the-path-to-pkg.patch 2021-08-20 23:53:11.000000000 +0200
@@ -0,0 +1,139 @@
+From 5aae52d3ef316b3fd3c43b3f974a8032d279e6fc Mon Sep 17 00:00:00 2001
+From: Hugh McMaster <hugh.mcmas...@outlook.com>
+Date: Mon, 23 Dec 2019 22:11:05 +1100
+Subject: [PATCH] ICU-20924 Use pkg-config to generate the path to pkgdata.inc
+
+---
+ icu4c/source/tools/pkgdata/pkgdata.cpp | 84 +++++++++++++-------------
+ 1 file changed, 43 insertions(+), 41 deletions(-)
+
+diff --git a/icu4c/source/tools/pkgdata/pkgdata.cpp b/icu4c/source/tools/pkgdata/pkgdata.cpp
+index 7235a7f669..6406fcc7a5 100644
+--- a/source/tools/pkgdata/pkgdata.cpp
++++ b/source/tools/pkgdata/pkgdata.cpp
+@@ -95,7 +95,7 @@ static int32_t pkg_archiveLibrary(const char *targetDir, const char *version, UB
+ static void createFileNames(UPKGOptions *o, const char mode, const char *version_major, const char *version, const char *libName, const UBool reverseExt, UBool noVersion);
+ static int32_t initializePkgDataFlags(UPKGOptions *o);
+
+-static int32_t pkg_getOptionsFromICUConfig(UBool verbose, UOption *option);
++static int32_t pkg_getPkgDataPath(UBool verbose, UOption *option);
+ static int runCommand(const char* command, UBool specialHandling=FALSE);
+
+ #define IN_COMMON_MODE(mode) (mode == 'a' || mode == 'c')
+@@ -309,7 +309,7 @@ main(int argc, char* argv[]) {
+
+ #if !defined(WINDOWS_WITH_MSVC) || defined(USING_CYGWIN)
+ if(!options[BLDOPT].doesOccur && uprv_strcmp(options[MODE].value, "common") != 0) {
+- if (pkg_getOptionsFromICUConfig(options[VERBOSE].doesOccur, &options[BLDOPT]) != 0) {
++ if (pkg_getPkgDataPath(options[VERBOSE].doesOccur, &options[BLDOPT]) != 0) {
+ fprintf(stderr, " required parameter is missing: -O is required for static and shared builds.\n");
+ fprintf(stderr, "Run '%s --help' for help.\n", progname);
+ return 1;
+@@ -2158,41 +2158,46 @@ static void loadLists(UPKGOptions *o, UErrorCode *status)
+ } /* for each file list file */
+ }
+
+-/* Try calling icu-config directly to get the option file. */
+- static int32_t pkg_getOptionsFromICUConfig(UBool verbose, UOption *option) {
++/* Helper for pkg_getPkgDataPath() */
+ #if U_HAVE_POPEN
+- LocalPipeFilePointer p;
+- size_t n;
+- static char buf[512] = "";
++static UBool getPkgDataPath(const char *cmd, UBool verbose, char *buf, size_t items) {
+ icu::CharString cmdBuf;
+ UErrorCode status = U_ZERO_ERROR;
+- const char cmd[] = "icu-config --incpkgdatafile";
+- char dirBuf[1024] = "";
+- /* #1 try the same path where pkgdata was called from. */
+- findDirname(progname, dirBuf, UPRV_LENGTHOF(dirBuf), &status);
+- if(U_SUCCESS(status)) {
+- cmdBuf.append(dirBuf, status);
+- if (cmdBuf[0] != 0) {
+- cmdBuf.append( U_FILE_SEP_STRING, status );
+- }
+- cmdBuf.append( cmd, status );
+-
+- if(verbose) {
+- fprintf(stdout, "# Calling icu-config: %s\n", cmdBuf.data());
+- }
+- p.adoptInstead(popen(cmdBuf.data(), "r"));
+- }
+-
+- if(p.isNull() || (n = fread(buf, 1, UPRV_LENGTHOF(buf)-1, p.getAlias())) <= 0) {
+- if(verbose) {
+- fprintf(stdout, "# Calling icu-config: %s\n", cmd);
+- }
++ LocalPipeFilePointer p;
++ size_t n;
+
+- p.adoptInstead(popen(cmd, "r"));
+- if(p.isNull() || (n = fread(buf, 1, UPRV_LENGTHOF(buf)-1, p.getAlias())) <= 0) {
+- fprintf(stderr, "%s: icu-config: No icu-config found. (fix PATH or use -O option)\n", progname);
++ cmdBuf.append(cmd, status);
++ if (verbose) {
++ fprintf(stdout, "# Calling: %s\n", cmdBuf.data());
++ }
++ p.adoptInstead( popen(cmdBuf.data(), "r") );
++
++ if (p.isNull() || (n = fread(buf, 1, items-1, p.getAlias())) <= 0) {
++ fprintf(stderr, "%s: Error calling '%s'\n", progname, cmd);
++ *buf = 0;
++ return FALSE;
++ }
++
++ return TRUE;
++}
++#endif
++
++/* Get path to pkgdata.inc. Try pkg-config first, falling back to icu-config. */
++static int32_t pkg_getPkgDataPath(UBool verbose, UOption *option) {
++#if U_HAVE_POPEN
++ static char buf[512] = "";
++ UBool pkgconfigIsValid = TRUE;
++ const char *pkgconfigCmd = "pkg-config --variable=pkglibdir icu-uc";
++ const char *icuconfigCmd = "icu-config --incpkgdatafile";
++ const char *pkgdata = "pkgdata.inc";
++
++ if (!getPkgDataPath(pkgconfigCmd, verbose, buf, UPRV_LENGTHOF(buf))) {
++ if (!getPkgDataPath(icuconfigCmd, verbose, buf, UPRV_LENGTHOF(buf))) {
++ fprintf(stderr, "%s: icu-config not found. Fix PATH or specify -O option\n", progname);
+ return -1;
+ }
++
++ pkgconfigIsValid = FALSE;
+ }
+
+ for (int32_t length = strlen(buf) - 1; length >= 0; length--) {
+@@ -2203,21 +2208,18 @@ static void loadLists(UPKGOptions *o, UErrorCode *status)
+ }
+ }
+
+- if(buf[strlen(buf)-1]=='\n')
+- {
+- buf[strlen(buf)-1]=0;
+- }
+-
+- if(buf[0] == 0)
+- {
+- fprintf(stderr, "%s: icu-config: invalid response from icu-config (fix PATH or use -O option)\n", progname);
++ if (!*buf) {
++ fprintf(stderr, "%s: Unable to locate pkgdata.inc. Unable to parse the results of '%s'. Check paths or use the -O option to specify the path to pkgdata.inc.\n", progname, pkgconfigIsValid ? pkgconfigCmd : icuconfigCmd);
+ return -1;
+ }
+
+- if(verbose) {
+- fprintf(stdout, "# icu-config said: %s\n", buf);
++ if (pkgconfigIsValid) {
++ uprv_strcat(buf, U_FILE_SEP_STRING);
++ uprv_strcat(buf, pkgdata);
+ }
+
++ buf[strlen(buf)] = 0;
++
+ option->value = buf;
+ option->doesOccur = TRUE;
+
+--
+2.25.1
+
diff -Nru icu-63.1/debian/patches/series icu-63.1/debian/patches/series
--- icu-63.1/debian/patches/series 2020-03-13 19:49:31.000000000 +0100
+++ icu-63.1/debian/patches/series 2021-08-20 23:53:11.000000000 +0200
@@ -6,3 +6,4 @@
ICU-20246_Fixing_another_integer_overflow_in_number_parsing.patch
ICU-20208_uspoof.cpp_function_checkImpl_should_be_static.patch
CVE-2020-10531.patch
+ICU-20924-Use-pkg-config-to-generate-the-path-to-pkg.patch
--- End Message ---