SDL: Fix invalid memory access in getSystemLanguage.
A call to setlocale can invalidate the string a previous setlocale call
returned. Instead of saving a pointer we copy the returned string now. This,
for example, fixes invalid memory access on my system.
See de8da01b0e
for the commit introducing the
invalid memory access.
This commit is contained in:
parent
1a440b5ef2
commit
919e577ba6
1 changed files with 5 additions and 5 deletions
|
@ -392,7 +392,7 @@ Common::String OSystem_SDL::getSystemLanguage() const {
|
|||
}
|
||||
#else // WIN32
|
||||
// Activating current locale settings
|
||||
const char *locale = setlocale(LC_ALL, "");
|
||||
const Common::String locale = setlocale(LC_ALL, "");
|
||||
|
||||
// Restore default C locale to prevent issues with
|
||||
// portability of sscanf(), atof(), etc.
|
||||
|
@ -400,7 +400,7 @@ Common::String OSystem_SDL::getSystemLanguage() const {
|
|||
setlocale(LC_ALL, "C");
|
||||
|
||||
// Detect the language from the locale
|
||||
if (!locale) {
|
||||
if (locale.empty()) {
|
||||
return ModularBackend::getSystemLanguage();
|
||||
} else {
|
||||
int length = 0;
|
||||
|
@ -409,14 +409,14 @@ Common::String OSystem_SDL::getSystemLanguage() const {
|
|||
// ".UTF-8" or the like. We do this, since
|
||||
// our translation languages are usually
|
||||
// specified without any charset information.
|
||||
for (int i = 0; locale[i]; ++i, ++length) {
|
||||
for (int size = locale.size(); length < size; ++length) {
|
||||
// TODO: Check whether "@" should really be checked
|
||||
// here.
|
||||
if (locale[i] == '.' || locale[i] == ' ' || locale[i] == '@')
|
||||
if (locale[length] == '.' || locale[length] == ' ' || locale[length] == '@')
|
||||
break;
|
||||
}
|
||||
|
||||
return Common::String(locale, length);
|
||||
return Common::String(locale.c_str(), length);
|
||||
}
|
||||
#endif // WIN32
|
||||
#else // USE_DETECTLANG
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue