diff --git a/pkgs/development/libraries/glibc/default.nix b/pkgs/development/libraries/glibc/default.nix index 0b096bfd66e..7aea33cc891 100644 --- a/pkgs/development/libraries/glibc/default.nix +++ b/pkgs/development/libraries/glibc/default.nix @@ -32,6 +32,9 @@ stdenv.mkDerivation { # This is a patch to make glibc compile under GCC 3.3. Presumably # later releases of glibc won't need this. # ./glibc-2.3.2-sscanf-1.patch + + # Fix for localedata loading bug. + ./loadlocale.patch ]; inherit kernelHeaders installLocales; diff --git a/pkgs/development/libraries/glibc/loadlocale.patch b/pkgs/development/libraries/glibc/loadlocale.patch new file mode 100644 index 00000000000..5bd00805200 --- /dev/null +++ b/pkgs/development/libraries/glibc/loadlocale.patch @@ -0,0 +1,67 @@ +This patch fixes +http://sources.redhat.com/bugzilla/show_bug.cgi?id=356, "localedata: +tests-mbwc/tst_iswalnum segfaults during make check". + +=================================================================== +RCS file: /cvs/glibc/libc/locale/loadlocale.c,v +retrieving revision 1.44 +retrieving revision 1.45 +diff -u -r1.44 -r1.45 +--- libc/locale/loadlocale.c 2003/09/03 07:54:22 1.44 ++++ libc/locale/loadlocale.c 2004/09/26 05:48:14 1.45 +@@ -1,5 +1,5 @@ + /* Functions to read locale data files. +- Copyright (C) 1996-2001, 2002, 2003 Free Software Foundation, Inc. ++ Copyright (C) 1996-2001, 2002, 2003, 2004 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper , 1996. + +@@ -115,15 +115,45 @@ + __set_errno (EINVAL); + return NULL; + } +- if (__builtin_expect (_nl_value_types[category][cnt] == word, 0)) ++ ++ /* Determine the type. There is one special case: the LC_CTYPE ++ category can have more elements than there are in the ++ _nl_value_type_LC_XYZ array. There are all pointers. */ ++ switch (category) ++ { ++#define CATTEST(cat) \ ++ case LC_##cat: \ ++ assert (cnt < (sizeof (_nl_value_type_LC_##cat) \ ++ / sizeof (_nl_value_type_LC_##cat[0]))); \ ++ break ++ CATTEST (NUMERIC); ++ CATTEST (TIME); ++ CATTEST (COLLATE); ++ CATTEST (MONETARY); ++ CATTEST (MESSAGES); ++ CATTEST (PAPER); ++ CATTEST (NAME); ++ CATTEST (ADDRESS); ++ CATTEST (TELEPHONE); ++ CATTEST (MEASUREMENT); ++ CATTEST (IDENTIFICATION); ++ default: ++ assert (category == LC_CTYPE); ++ break; ++ } ++ ++ if ((category == LC_CTYPE ++ && cnt >= (sizeof (_nl_value_type_LC_CTYPE) ++ / sizeof (_nl_value_type_LC_CTYPE[0]))) ++ || __builtin_expect (_nl_value_types[category][cnt] != word, 1)) ++ newdata->values[cnt].string = newdata->filedata + idx; ++ else + { + if (idx % __alignof__ (u_int32_t) != 0) + goto puntdata; + newdata->values[cnt].word = + *((const u_int32_t *) (newdata->filedata + idx)); + } +- else +- newdata->values[cnt].string = newdata->filedata + idx; + } + + return newdata;