aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohannes Schickel2013-11-03 18:43:51 +0100
committerJohannes Schickel2013-11-03 18:47:03 +0100
commit919e577ba665002c1513b53a755cb1d663b99f7e (patch)
treea101ae5ace7ef76114031a07a013d0b4e9e44c21
parent1a440b5ef27c5cfa684286f4f58564d97a544231 (diff)
downloadscummvm-rg350-919e577ba665002c1513b53a755cb1d663b99f7e.tar.gz
scummvm-rg350-919e577ba665002c1513b53a755cb1d663b99f7e.tar.bz2
scummvm-rg350-919e577ba665002c1513b53a755cb1d663b99f7e.zip
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 de8da01b0e8a309b9ed3f5b0f152ebbcf8f4af37 for the commit introducing the invalid memory access.
-rw-r--r--backends/platform/sdl/sdl.cpp10
1 files changed, 5 insertions, 5 deletions
diff --git a/backends/platform/sdl/sdl.cpp b/backends/platform/sdl/sdl.cpp
index 508c5f4e92..bc80d8ad6a 100644
--- a/backends/platform/sdl/sdl.cpp
+++ b/backends/platform/sdl/sdl.cpp
@@ -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