mirror of
https://sourceware.org/git/glibc.git
synced 2024-11-24 02:03:35 +08:00
setlocale: Use the heap for the copy of the locale argument
This avoids alloca calls with potentially large arguments.
This commit is contained in:
parent
888c679ba4
commit
d183645616
@ -1,3 +1,8 @@
|
||||
2014-07-02 Florian Weimer <fweimer@redhat.com>
|
||||
|
||||
* locale/setlocale.c (setlocale): Use strdup for allocating
|
||||
composite name copy.
|
||||
|
||||
2014-07-10 Siddhesh Poyarekar <siddhesh@redhat.com>
|
||||
|
||||
Sync up with gnulib.
|
||||
|
@ -272,6 +272,8 @@ setlocale (int category, const char *locale)
|
||||
of entries of the form `CATEGORY=VALUE'. */
|
||||
const char *newnames[__LC_LAST];
|
||||
struct __locale_data *newdata[__LC_LAST];
|
||||
/* Copy of the locale argument, for in-place splitting. */
|
||||
char *locale_copy = NULL;
|
||||
|
||||
/* Set all name pointers to the argument name. */
|
||||
for (category = 0; category < __LC_LAST; ++category)
|
||||
@ -281,7 +283,13 @@ setlocale (int category, const char *locale)
|
||||
if (__glibc_unlikely (strchr (locale, ';') != NULL))
|
||||
{
|
||||
/* This is a composite name. Make a copy and split it up. */
|
||||
char *np = strdupa (locale);
|
||||
locale_copy = strdup (locale);
|
||||
if (__glibc_unlikely (locale_copy == NULL))
|
||||
{
|
||||
__libc_rwlock_unlock (__libc_setlocale_lock);
|
||||
return NULL;
|
||||
}
|
||||
char *np = locale_copy;
|
||||
char *cp;
|
||||
int cnt;
|
||||
|
||||
@ -299,6 +307,7 @@ setlocale (int category, const char *locale)
|
||||
{
|
||||
error_return:
|
||||
__libc_rwlock_unlock (__libc_setlocale_lock);
|
||||
free (locale_copy);
|
||||
|
||||
/* Bogus category name. */
|
||||
ERROR_RETURN;
|
||||
@ -391,8 +400,9 @@ setlocale (int category, const char *locale)
|
||||
/* Critical section left. */
|
||||
__libc_rwlock_unlock (__libc_setlocale_lock);
|
||||
|
||||
/* Free the resources (the locale path variable). */
|
||||
/* Free the resources. */
|
||||
free (locale_path);
|
||||
free (locale_copy);
|
||||
|
||||
return composite;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user