From: ludo at gnu dot org (Ludovic =?utf-8?Q?Court=C3=A8s?=) To: libc-alpha at sourceware dot org Subject: [PATCH] Gracefully handle incompatible locale data Date: Tue, 22 Sep 2015 17:27:55 +0200 With libc 2.22 people are starting to realize that libc does not guarantee that it can load locale data built with another libc version, but they learn it the hard way: loadlocale.c:130: _nl_intern_locale_data: Assertion `cnt < (sizeof (_nl_v= alue_type_LC_COLLATE) / sizeof (_nl_value_type_LC_COLLATE[0]))' failed. This patch changes such conditions to return EINVAL instead of aborting. WDYT? Thanks, Ludo=E2=80=99. 2015-10-22 Ludovic Court=C3=A8s * locale/loadlocale.c (_nl_intern_locale_data): Change assertion on CNT to a conditional jump to 'puntdata'. --- glibc-2.22/locale/loadlocale.c~ 2015-08-05 08:42:21.000000000 +0200 +++ glibc-2.22/locale/loadlocale.c 2015-10-17 22:29:26.612455638 +0200 @@ -122,8 +122,9 @@ _nl_intern_locale_data (int category, co { #define CATTEST(cat) \ case LC_##cat: \ - assert (cnt < (sizeof (_nl_value_type_LC_##cat) \ - / sizeof (_nl_value_type_LC_##cat[0]))); \ + if (cnt >= (sizeof (_nl_value_type_LC_##cat) \ + / sizeof (_nl_value_type_LC_##cat[0]))) \ + goto puntdata; \ break CATTEST (NUMERIC); CATTEST (TIME);