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:
Johannes Schickel 2013-11-03 18:43:51 +01:00
parent 1a440b5ef2
commit 919e577ba6

View file

@ -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