Avoid unsafe loc_name type casts with additional variable

for  ChangeLog

	[BZ #15969]
	* locale/findlocale.c (_nl_find_locale): Introduce const
	version of loc_name and drop unsafe type casts.
This commit is contained in:
Alexandre Oliva 2015-02-27 22:18:56 -03:00
parent c7b19ca99a
commit e7f07af50b
2 changed files with 28 additions and 23 deletions

View File

@ -1,3 +1,9 @@
2015-02-27 Alexandre Oliva <aoliva@redhat.com>
[BZ #15969]
* locale/findlocale.c (_nl_find_locale): Introduce const
version of loc_name and drop unsafe type casts.
2015-02-27 Roland McGrath <roland@hack.frob.com> 2015-02-27 Roland McGrath <roland@hack.frob.com>
* dlfcn/tststatic2.c (main): Converted to ... * dlfcn/tststatic2.c (main): Converted to ...

View File

@ -105,7 +105,7 @@ _nl_find_locale (const char *locale_path, size_t locale_path_len,
{ {
int mask; int mask;
/* Name of the locale for this category. */ /* Name of the locale for this category. */
char *loc_name = (char *) *name; const char *cloc_name = *name;
const char *language; const char *language;
const char *modifier; const char *modifier;
const char *territory; const char *territory;
@ -113,39 +113,39 @@ _nl_find_locale (const char *locale_path, size_t locale_path_len,
const char *normalized_codeset; const char *normalized_codeset;
struct loaded_l10nfile *locale_file; struct loaded_l10nfile *locale_file;
if (loc_name[0] == '\0') if (cloc_name[0] == '\0')
{ {
/* The user decides which locale to use by setting environment /* The user decides which locale to use by setting environment
variables. */ variables. */
loc_name = getenv ("LC_ALL"); cloc_name = getenv ("LC_ALL");
if (!name_present (loc_name)) if (!name_present (cloc_name))
loc_name = getenv (_nl_category_names.str cloc_name = getenv (_nl_category_names.str
+ _nl_category_name_idxs[category]); + _nl_category_name_idxs[category]);
if (!name_present (loc_name)) if (!name_present (cloc_name))
loc_name = getenv ("LANG"); cloc_name = getenv ("LANG");
if (!name_present (loc_name)) if (!name_present (cloc_name))
loc_name = (char *) _nl_C_name; cloc_name = _nl_C_name;
} }
/* We used to fall back to the C locale if the name contains a slash /* We used to fall back to the C locale if the name contains a slash
character '/', but we now check for directory traversal in character '/', but we now check for directory traversal in
valid_locale_name, so this is no longer necessary. */ valid_locale_name, so this is no longer necessary. */
if (__builtin_expect (strcmp (loc_name, _nl_C_name), 1) == 0 if (__builtin_expect (strcmp (cloc_name, _nl_C_name), 1) == 0
|| __builtin_expect (strcmp (loc_name, _nl_POSIX_name), 1) == 0) || __builtin_expect (strcmp (cloc_name, _nl_POSIX_name), 1) == 0)
{ {
/* We need not load anything. The needed data is contained in /* We need not load anything. The needed data is contained in
the library itself. */ the library itself. */
*name = (char *) _nl_C_name; *name = _nl_C_name;
return _nl_C[category]; return _nl_C[category];
} }
else if (!valid_locale_name (loc_name)) else if (!valid_locale_name (cloc_name))
{ {
__set_errno (EINVAL); __set_errno (EINVAL);
return NULL; return NULL;
} }
*name = loc_name; *name = cloc_name;
/* We really have to load some data. First we try the archive, /* We really have to load some data. First we try the archive,
but only if there was no LOCPATH environment variable specified. */ but only if there was no LOCPATH environment variable specified. */
@ -158,11 +158,10 @@ _nl_find_locale (const char *locale_path, size_t locale_path_len,
/* Nothing in the archive with the given name. Expanding it as /* Nothing in the archive with the given name. Expanding it as
an alias and retry. */ an alias and retry. */
loc_name = (char *) _nl_expand_alias (*name); cloc_name = _nl_expand_alias (*name);
if (loc_name != NULL) if (cloc_name != NULL)
{ {
data = _nl_load_locale_from_archive (category, data = _nl_load_locale_from_archive (category, &cloc_name);
(const char **) &loc_name);
if (__builtin_expect (data != NULL, 1)) if (__builtin_expect (data != NULL, 1))
return data; return data;
} }
@ -175,14 +174,14 @@ _nl_find_locale (const char *locale_path, size_t locale_path_len,
/* We really have to load some data. First see whether the name is /* We really have to load some data. First see whether the name is
an alias. Please note that this makes it impossible to have "C" an alias. Please note that this makes it impossible to have "C"
or "POSIX" as aliases. */ or "POSIX" as aliases. */
loc_name = (char *) _nl_expand_alias (*name); cloc_name = _nl_expand_alias (*name);
if (loc_name == NULL) if (cloc_name == NULL)
/* It is no alias. */ /* It is no alias. */
loc_name = (char *) *name; cloc_name = *name;
/* Make a writable copy of the locale name. */ /* Make a writable copy of the locale name. */
loc_name = strdupa (loc_name); char *loc_name = strdupa (cloc_name);
/* LOCALE can consist of up to four recognized parts for the XPG syntax: /* LOCALE can consist of up to four recognized parts for the XPG syntax: