diff options
author | Corinna Vinschen <corinna@vinschen.de> | 2016-08-24 19:46:55 +0200 |
---|---|---|
committer | Corinna Vinschen <corinna@vinschen.de> | 2016-08-24 19:46:55 +0200 |
commit | a703d64ad7edac344e4959e8d624ce1d8012678b (patch) | |
tree | c2238816615dffa447c9041b91d7c0d18853dfc0 /newlib/libc/locale | |
parent | 2fd2f308e2504b37a94fa3e3b476ec691ee005c5 (diff) | |
download | newlib-a703d64ad7edac344e4959e8d624ce1d8012678b.zip newlib-a703d64ad7edac344e4959e8d624ce1d8012678b.tar.gz newlib-a703d64ad7edac344e4959e8d624ce1d8012678b.tar.bz2 |
Avoid crash when calling __localeconv_l with __C_locale
__C_locale is const. Thus, overwriting the lconv values in __localeconv_l
will try to write to a R/O region. Given the lconv values in __C_locale
are initialized, there's no reason to write them in __localeconv_l at all.
Just return &__C_locale.lconv.
Signed-off-by: Corinna Vinschen <corinna@vinschen.de>
Diffstat (limited to 'newlib/libc/locale')
-rw-r--r-- | newlib/libc/locale/localeconv.c | 3 |
1 files changed, 3 insertions, 0 deletions
diff --git a/newlib/libc/locale/localeconv.c b/newlib/libc/locale/localeconv.c index 1f8816d..165f6f7 100644 --- a/newlib/libc/locale/localeconv.c +++ b/newlib/libc/locale/localeconv.c @@ -6,6 +6,9 @@ struct lconv * __localeconv_l (struct __locale_t *locale) { struct lconv *lconv = &locale->lconv; + if (locale == __get_C_locale ()) + return lconv; + #ifdef __HAVE_LOCALE_INFO__ const struct lc_numeric_T *n = __get_numeric_locale (locale); const struct lc_monetary_T *m = __get_monetary_locale (locale); |