nixpkgs/pkgs/development/libraries/glibc/loadlocale.patch
Eelco Dolstra 76c0fe8cfe * Fix for http://sources.redhat.com/bugzilla/show_bug.cgi?id=356.
svn path=/nixpkgs/trunk/; revision=1820
2004-11-30 13:45:56 +00:00

68 lines
2.1 KiB
Diff

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 <drepper@cygnus.com>, 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;