76c0fe8cfe
svn path=/nixpkgs/trunk/; revision=1820
68 lines
2.1 KiB
Diff
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;
|