From: Ulrich Drepper Date: Sat, 28 May 2011 20:59:30 +0000 (-0400) Subject: Handle failure of _nl_explode_name in all cases X-Git-Tag: glibc-2.14~26 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=4f031072a5055abd83717820b59efdaa463d5853;p=thirdparty%2Fglibc.git Handle failure of _nl_explode_name in all cases --- diff --git a/ChangeLog b/ChangeLog index 8bfd2902576..eeafebd1e8b 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,9 @@ 2011-05-28 Ulrich Drepper + * locale/findlocale.c (_nl_find_locale): Return right away if + _nl_explode_name failed. + * locale/programs/locarchive.c (add_locale_to_archive): Likewise. + * sysdeps/unix/sysv/linux/socketcall.h (SOCKOP_sendmmsg): Define. * debug/xtrace.sh: Unify messages. diff --git a/locale/findlocale.c b/locale/findlocale.c index 6b88c963417..2fec9a70d59 100644 --- a/locale/findlocale.c +++ b/locale/findlocale.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1996-2001, 2002, 2003, 2006, 2010 Free Software Foundation, Inc. +/* Copyright (C) 1996-2003, 2006, 2010, 2011 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper , 1996. @@ -140,6 +140,9 @@ _nl_find_locale (const char *locale_path, size_t locale_path_len, */ mask = _nl_explode_name (loc_name, &language, &modifier, &territory, &codeset, &normalized_codeset); + if (mask == -1) + /* Memory allocate problem. */ + return NULL; /* If exactly this locale was already asked for we have an entry with the complete name. */ diff --git a/locale/programs/locarchive.c b/locale/programs/locarchive.c index 85ba77d1947..e95bcf1a140 100644 --- a/locale/programs/locarchive.c +++ b/locale/programs/locarchive.c @@ -1,4 +1,4 @@ -/* Copyright (C) 2002, 2003, 2005, 2007, 2009 Free Software Foundation, Inc. +/* Copyright (C) 2002,2003,2005,2007,2009,2011 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper , 2002. @@ -1079,6 +1079,8 @@ add_locale_to_archive (ah, name, data, replace) int mask = _nl_explode_name (strdupa (name), &language, &modifier, &territory, &codeset, &normalized_codeset); + if (mask == -1) + return -1; if (mask & XPG_NORM_CODESET) /* This name contains a codeset in unnormalized form. @@ -1128,6 +1130,7 @@ add_locale_to_archive (ah, name, data, replace) /* Now read the locale.alias files looking for lines whose right hand side matches our name after normalization. */ + int result = 0; if (alias_file != NULL) { FILE *fp; @@ -1207,6 +1210,11 @@ add_locale_to_archive (ah, name, data, replace) &rhs_territory, &rhs_codeset, &rhs_normalized_codeset); + if (rhs_mask == 1) + { + result = -1; + goto out; + } if (!strcmp (language, rhs_language) && ((rhs_mask & XPG_CODESET) /* He has a codeset, it must match normalized. */ @@ -1240,6 +1248,7 @@ add_locale_to_archive (ah, name, data, replace) } } + out: fclose (fp); } @@ -1248,7 +1257,7 @@ add_locale_to_archive (ah, name, data, replace) if (mask & XPG_NORM_CODESET) free ((char *) normalized_codeset); - return 0; + return result; }