From 0034c1747f089ac1974aa88e9fd7e259fb38c504 Mon Sep 17 00:00:00 2001 From: Florian Weimer Date: Sun, 27 Jun 2021 19:07:54 +0200 Subject: [PATCH] Apply emergency patch to fix iconvconfig corruption --- glibc-iconvconfig-corruption.patch | 107 +++++++++++++++++++++++++++++ glibc.spec | 6 +- 2 files changed, 112 insertions(+), 1 deletion(-) create mode 100644 glibc-iconvconfig-corruption.patch diff --git a/glibc-iconvconfig-corruption.patch b/glibc-iconvconfig-corruption.patch new file mode 100644 index 0000000..4b18758 --- /dev/null +++ b/glibc-iconvconfig-corruption.patch @@ -0,0 +1,107 @@ +Emergency patch from libc-alpha. + +From: Siddhesh Poyarekar +Subject: [PATCH v2] iconvconfig: Fix multiple issues +To: libc-alpha@sourceware.org +Cc: schwab@linux-m68k.org, fweimer@redhat.com +Date: Fri, 25 Jun 2021 14:31:28 +0530 +Message-Id: <20210625090128.316837-1-siddhesh@sourceware.org> + +It was noticed on big-endian systems that msgfmt would fail with the +following error: + +msgfmt: gconv_builtin.c:70: __gconv_get_builtin_trans: Assertion `cnt < sizeof (map) / sizeof (map[0])' failed. +Aborted (core dumped) + +This is only seen on installed systems because it was due to a +corrupted gconv-modules.cache. iconvconfig had the following issues +(it was specifically freeing fulldir that caused this issue, but other +cleanups are also needed) that this patch fixes. + +- Add prefix only if dir starts with '/' +- Use asprintf instead of mempcpy so that the directory string is NULL + terminated +- Make a copy of the directory reference in new_module so that fulldir + can be freed within the same scope in handle_dir. +--- + iconv/Makefile | 2 +- + iconv/iconvconfig.c | 24 +++++++++--------------- + 2 files changed, 10 insertions(+), 16 deletions(-) + +diff --git a/iconv/Makefile b/iconv/Makefile +index a9b267c851..07d77c9eca 100644 +--- a/iconv/Makefile ++++ b/iconv/Makefile +@@ -33,7 +33,7 @@ vpath %.c ../locale/programs ../intl + iconv_prog-modules = iconv_charmap charmap charmap-dir linereader \ + dummy-repertoire simple-hash xstrdup xmalloc \ + record-status +-iconvconfig-modules = strtab xmalloc hash-string ++iconvconfig-modules = strtab xmalloc xasprintf xstrdup hash-string + extra-objs = $(iconv_prog-modules:=.o) $(iconvconfig-modules:=.o) + CFLAGS-iconv_prog.c += -I../locale/programs + CFLAGS-iconv_charmap.c += -I../locale/programs +diff --git a/iconv/iconvconfig.c b/iconv/iconvconfig.c +index e69334d71c..783b2bbdbb 100644 +--- a/iconv/iconvconfig.c ++++ b/iconv/iconvconfig.c +@@ -250,6 +250,7 @@ static const char gconv_module_ext[] = MODULE_EXT; + + + #include ++#include + + + /* C string table handling. */ +@@ -519,11 +520,12 @@ module_compare (const void *p1, const void *p2) + /* Create new module record. */ + static void + new_module (const char *fromname, size_t fromlen, const char *toname, +- size_t tolen, const char *directory, ++ size_t tolen, const char *dir_in, + const char *filename, size_t filelen, int cost, size_t need_ext) + { + struct module *new_module; +- size_t dirlen = strlen (directory) + 1; ++ size_t dirlen = strlen (dir_in) + 1; ++ const char *directory = xstrdup (dir_in); + char *tmp; + void **inserted; + +@@ -654,20 +656,10 @@ handle_dir (const char *dir) + size_t dirlen = strlen (dir); + bool found = false; + +- /* Add the prefix before sending it off to the parser. */ +- char *fulldir = xmalloc (prefix_len + dirlen + 2); +- char *cp = mempcpy (mempcpy (fulldir, prefix, prefix_len), dir, dirlen); ++ char *fulldir = xasprintf ("%s%s%s", dir[0] == '/' ? prefix : "", ++ dir, dir[dirlen - 1] != '/' ? "/" : ""); + +- if (dir[dirlen - 1] != '/') +- { +- *cp++ = '/'; +- *cp = '\0'; +- dirlen++; +- } +- +- found = gconv_parseconfdir (fulldir, dirlen + prefix_len); +- +- free (fulldir); ++ found = gconv_parseconfdir (fulldir, strlen (fulldir)); + + if (!found) + { +@@ -679,6 +671,8 @@ handle_dir (const char *dir) + "configuration files with names ending in .conf."); + } + ++ free (fulldir); ++ + return found ? 0 : 1; + } + +-- + +2.31.1 + diff --git a/glibc.spec b/glibc.spec index 42056ed..7f0ff38 100644 --- a/glibc.spec +++ b/glibc.spec @@ -111,7 +111,7 @@ Summary: The GNU libc libraries Name: glibc Version: %{glibcversion} -Release: 28%{?dist} +Release: 29%{?dist} # In general, GPLv2+ is used by programs, LGPLv2+ is used for # libraries. @@ -195,6 +195,7 @@ Patch35: glibc-nosymlink-2.patch Patch36: glibc-nosymlink-3.patch Patch37: glibc-nosymlink-4.patch Patch38: glibc-libthread_db-dynsym.patch +Patch39: glibc-iconvconfig-corruption.patch ############################################################################## # Continued list of core "glibc" package information: @@ -2212,6 +2213,9 @@ fi %files -f compat-libpthread-nonshared.filelist -n compat-libpthread-nonshared %changelog +* Sun Jun 27 2021 Florian Weimer - 2.33.9000-29 +- Apply emergency patch to fix iconvconfig corruption + * Sun Jun 27 2021 Florian Weimer - 2.33.9000-28 - Adjust glibc.req so that egrep does not cause eu-readelf to fail