From: Victor Chiletto vchiletto@codeweavers.com
--- dlls/msvcrt/locale.c | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-)
diff --git a/dlls/msvcrt/locale.c b/dlls/msvcrt/locale.c index a24c0c16a48..1d2edd74704 100644 --- a/dlls/msvcrt/locale.c +++ b/dlls/msvcrt/locale.c @@ -338,11 +338,14 @@ BOOL locale_to_sname(const char *locale, unsigned short *codepage, BOOL *sname_m DWORD locale_cp;
if (!strcmp(locale, data->cached_locale)) { + if (sname_size < wcslen(data->cached_sname) + 1) + return FALSE; + if (codepage) *codepage = data->cached_cp; if (sname_match) *sname_match = data->cached_sname_match; - wcsncpy(sname, data->cached_sname, sname_size); + wcscpy(sname, data->cached_sname); return TRUE; }
@@ -388,7 +391,10 @@ BOOL locale_to_sname(const char *locale, unsigned short *codepage, BOOL *sname_m if (search.allow_sname && IsValidLocaleName(search.search_language)) { search.match_flags = FOUND_SNAME; - wcsncpy(sname, search.search_language, sname_size); + + if (sname_size < wcslen(search.search_language) + 1) + return FALSE; + wcscpy(sname, search.search_language); } else { @@ -404,7 +410,9 @@ BOOL locale_to_sname(const char *locale, unsigned short *codepage, BOOL *sname_m if (search.search_country[0] && !(search.match_flags & FOUND_COUNTRY)) return FALSE;
- wcsncpy(sname, search.found_lang_sname, sname_size); + if (sname_size < wcslen(search.found_lang_sname) + 1) + return FALSE; + wcscpy(sname, search.found_lang_sname); }
is_sname = !remapped && (search.match_flags & FOUND_SNAME) != 0;