diff options
author | Johannes Schickel | 2013-11-03 18:43:51 +0100 |
---|---|---|
committer | Johannes Schickel | 2013-11-03 18:47:03 +0100 |
commit | 919e577ba665002c1513b53a755cb1d663b99f7e (patch) | |
tree | a101ae5ace7ef76114031a07a013d0b4e9e44c21 /backends/platform/sdl | |
parent | 1a440b5ef27c5cfa684286f4f58564d97a544231 (diff) | |
download | scummvm-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.
Diffstat (limited to 'backends/platform/sdl')
-rw-r--r-- | backends/platform/sdl/sdl.cpp | 10 |
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 |