SDL2 for the Nintendo Wii U (build with "cmake [SDL source path] -DCMAKE_TOOLCHAIN_FILE=$WUT_ROOT/share/wut.toolchain.cmake -DCMAKE_INSTALL_PREFIX=$DEVKITPRO/portlibs/wiiu")
Go to file
Sam Lantinga 4aae6e7d86 Fixed bug 1938 - Buffer overflows in the Windows IME code
norfanin

There are a few potential buffer overflows in the Windows IME code located in the SDL_windowskeyboard.c file. [1] They mainly happen because the code passes the number of bytes instead of the number of characters to the wide-character string functions wcslcpy and wcslcat. In another place, the code assumes that the composition cursor position can never go beyond the size of the composition string buffer.

Some of these overflows and overruns can occur with the Japanese IME on Vista and simplified Chinese IME on XP. I don't actually speak those languages and it's my first time using the IMEs, so I probably pushed them to the limit where nobody would still be compositing proper words. They don't cause any immediate access violation, although the possibility of trashing the SDL_VideoData structure is never good.

I've attached a patch that fixes those I found, but because I'm very new to the code it may be worthwhile if someone else also has a look over the code.

I'll go over the changes in my patch and explain what, why and how.

In the function IME_GetReadingString, there is a wcslcpy to copy the reading string from the IMC memory to the SDL reading string buffer. [2] This assumes that the length of the reading string never exceeds the SDL buffer size. I guess that is possible and I wasn't able to get a long reading string in my tests, but the patch adds a simple check anyway.

In the function IME_GetCompositionString, the first line calls ImmGetCompositionStringW to get the composition string. [3] The Microsoft documentation states that the fourth argument is for the destination buffer size in bytes (even with unicode) and the code correctly passes the value of sizeof. However, at the end of IME_GetCompositionString, the string is terminated by setting the element at index 'length' to 0. 'length' is calculated by dividing the number of bytes (those written by ImmGetCompositionStringW) by 2. If it managed to write 64 bytes, the code sets element 32 to 0, which would be the beginning of the reading string if the alignment places it there. My patch adds a subtraction to the fourth argument, essentially making it always pass 62 instead.

In the same function, the code assumes that the composition cursor position doesn't go beyond the buffer size. [4] My patch adds a simple range check in front of the indirection.

In the function IME_SendEditingEvent, the size for the wide-character string functions is passed in bytes instead of characters. [5] Oddly, the current code subtracts 'len' from the size in one function call. This results in truncation in certain situations as the third argument is the number of characters available in the destination buffer. If I'm understanding it correctly, this is supposed to copy x characters of the composition buffer, then concatenate the whole reading string buffer, and then the rest of the composition buffer (where x is the composition cursor position). I don't see how a truncation of the rest would be helpful here. Perhaps this is just an error? My patch removes the subtraction.

In the function UIElementSink_UpdateUIElement, bytes instead of characters is used again for a wcslcpy call. [6]
2013-07-12 23:45:12 -07:00
acinclude We have to fix the DLL name convention on Windows every time... 2012-10-19 21:43:41 -07:00
android-project Adds Input Focus handling on Android to improve pausing/resuming behavior 2013-07-09 10:25:16 -03:00
build-scripts The standard fat gcc scripts work well with SDL 2.0 2013-06-01 12:53:06 -07:00
cmake Added src/thread/pthread/SDL_systls.c to the CMake scripts. 2013-07-11 01:09:45 -04:00
debian Renamed documentation files to .txt and converted them to DOS line endings so they would open properly on all systems. 2013-05-26 11:06:17 -07:00
include Fixed gcc warnings for apps using SDL headers with -Wstrict-prototypes flag. 2013-07-12 09:55:58 +03:00
src Fixed bug 1938 - Buffer overflows in the Windows IME code 2013-07-12 23:45:12 -07:00
test Removed some unused variables. 2013-07-11 12:27:39 -04:00
VisualC Implemented an API for thread-local storage: SDL_TLSCreate(), SDL_TLSSet(), SDL_TLSGet() 2013-07-10 02:32:04 -07:00
Xcode Implemented an API for thread-local storage: SDL_TLSCreate(), SDL_TLSSet(), SDL_TLSGet() 2013-07-10 02:32:04 -07:00
Xcode-iOS Implemented an API for thread-local storage: SDL_TLSCreate(), SDL_TLSSet(), SDL_TLSGet() 2013-07-10 02:32:04 -07:00
.hgignore Need to generate aclocal.m4 when rebuilding configure, but we don't need to check it in. 2013-05-26 16:01:40 -07:00
.hgtags Tagging version before everything gets ripped out. 2010-05-09 17:00:56 -07:00
Android.mk Improved include paths for projects using SDL on Android 2013-06-17 07:14:20 -07:00
autogen.sh Need to generate aclocal.m4 when rebuilding configure, but we don't need to check it in. 2013-05-26 16:01:40 -07:00
BUGS.txt Credits were truncated in a previous commit. 2013-05-27 21:44:16 -07:00
CMakeLists.txt CMake project should install sdl2.m4. 2013-07-13 00:10:25 -04:00
configure Implemented an API for thread-local storage: SDL_TLSCreate(), SDL_TLSSet(), SDL_TLSGet() 2013-07-10 02:32:04 -07:00
configure.in Implemented an API for thread-local storage: SDL_TLSCreate(), SDL_TLSSet(), SDL_TLSGet() 2013-07-10 02:32:04 -07:00
COPYING.txt Renamed documentation files to .txt and converted them to DOS line endings so they would open properly on all systems. 2013-05-26 11:06:17 -07:00
CREDITS.txt Credits were truncated in a previous commit. 2013-05-27 21:44:16 -07:00
INSTALL.txt Updated the installation instructions to cover all supported platforms 2013-05-26 12:42:46 -07:00
Makefile.in Backout hg changset 898992405fa7; lots of things still use SDL_types.h. :/ 2013-07-09 11:57:32 -04:00
Makefile.minimal Made it possible to build SDL from a fresh checkout without any additional steps. 2011-02-16 02:37:09 -08:00
Makefile.pandora Removed /dev/dsp DMA audio target. 2011-07-24 03:37:13 -07:00
Makefile.psp Add PSP support 2013-03-17 20:07:02 +08:00
Makefile.wiz Removed /dev/dsp DMA audio target. 2011-07-24 03:37:13 -07:00
README-android.txt Fixed recently deleted Ms in READMEs. 2013-05-30 12:15:00 +02:00
README-cmake.txt Renamed documentation files to .txt and converted them to DOS line endings so they would open properly on all systems. 2013-05-26 11:06:17 -07:00
README-directfb.txt Fixed recently deleted Ms in READMEs. 2013-05-30 12:15:00 +02:00
README-gesture.txt Fixed recently deleted Ms in READMEs. 2013-05-30 12:15:00 +02:00
README-hg.txt Fixed recently deleted Ms in READMEs. 2013-05-30 12:15:00 +02:00
README-ios.txt Fixed recently deleted Ms in READMEs. 2013-05-30 12:15:00 +02:00
README-macosx.txt Renamed documentation files to .txt and converted them to DOS line endings so they would open properly on all systems. 2013-05-26 11:06:17 -07:00
README-pandora.txt Renamed documentation files to .txt and converted them to DOS line endings so they would open properly on all systems. 2013-05-26 11:06:17 -07:00
README-platforms.txt Updated supported iOS version. 2013-07-12 23:16:11 -07:00
README-porting.txt Renamed documentation files to .txt and converted them to DOS line endings so they would open properly on all systems. 2013-05-26 11:06:17 -07:00
README-psp.txt Renamed documentation files to .txt and converted them to DOS line endings so they would open properly on all systems. 2013-05-26 11:06:17 -07:00
README-SDL.txt Renamed documentation files to .txt and converted them to DOS line endings so they would open properly on all systems. 2013-05-26 11:06:17 -07:00
README-touch.txt Fixed recently deleted Ms in READMEs. 2013-05-30 12:15:00 +02:00
README-wince.txt Renamed documentation files to .txt and converted them to DOS line endings so they would open properly on all systems. 2013-05-26 11:06:17 -07:00
README.txt Updated the README to match the new website text 2013-07-06 11:56:04 -07:00
sdl2-config.in Updated to SDL 2.0, and SDL 2.0 can now be installed coexisting with SDL 1.2 2012-01-22 17:21:00 -05:00
sdl2.m4 Default the minimum required version to 2.0.0 2013-06-01 08:57:17 -07:00
sdl2.pc.in Updated to SDL 2.0, and SDL 2.0 can now be installed coexisting with SDL 1.2 2012-01-22 17:21:00 -05:00
SDL2.spec.in Renamed documentation files to .txt and converted them to DOS line endings so they would open properly on all systems. 2013-05-26 11:06:17 -07:00
TODO.txt Renamed documentation files to .txt and converted them to DOS line endings so they would open properly on all systems. 2013-05-26 11:06:17 -07:00
VisualC.html Changed paths and name of header file in text of VisualC.html. 2013-06-29 22:08:38 +02:00
WhatsNew.txt Renamed WhatsNew so it can be easily read on Windows 2013-05-26 12:43:03 -07:00

                         Simple DirectMedia Layer

                                  (SDL)

                                Version 2.0

---
http://www.libsdl.org/

Simple DirectMedia Layer is a cross-platform development library designed
to provide low level access to audio, keyboard, mouse, joystick, and graphics
hardware via OpenGL and DirectX. It is used by video playback software,
emulators, and popular games including Valve's award winning catalog
and many Humble Bundle games.

The current version supports Windows, Mac OS X, Linux, iOS, and Android.
The code contains support for other operating systems but those are not
officially supported.

SDL is written in C, but works with C++ natively, and has bindings to
several other languages, including C#, Python and more in progress.

This library is distributed under the zlib license, which can be found
in the file "COPYING.txt".

The best way to learn how to use SDL is to check out the header files in
the "include" subdirectory and the programs in the "test" subdirectory.
The header files and test programs are well commented and always up to date.
More documentation and FAQs are available online at:
	http://wiki.libsdl.org/

If you need help with the library, or just want to discuss SDL related
issues, you can join the developers mailing list:
	http://www.libsdl.org/mailing-list.php

Enjoy!
	Sam Lantinga				(slouken@libsdl.org)