Module: wine Branch: master Commit: a823177ccbd241c231034fdd79a2088440923758 URL: https://gitlab.winehq.org/wine/wine/-/commit/a823177ccbd241c231034fdd79a2088...
Author: Rémi Bernon rbernon@codeweavers.com Date: Sat Jan 20 10:03:09 2024 +0100
win32u: Avoid truncating ToUnicodeEx result if there's room.
---
dlls/win32u/input.c | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-)
diff --git a/dlls/win32u/input.c b/dlls/win32u/input.c index 3ee46f0bfcf..aaaac12ce36 100644 --- a/dlls/win32u/input.c +++ b/dlls/win32u/input.c @@ -1187,27 +1187,25 @@ INT WINAPI NtUserToUnicodeEx( UINT virt, UINT scan, const BYTE *state, WCHAR *str, int size, UINT flags, HKL layout ) { const KBDTABLES *kbd_tables; - WCHAR buffer[2] = {0}; INT len;
TRACE_(keyboard)( "virt %#x, scan %#x, state %p, str %p, size %d, flags %#x, layout %p.\n", virt, scan, state, str, size, flags, layout );
- if (!state) return 0; + if (!state || !size) return 0; if ((len = user_driver->pToUnicodeEx( virt, scan, state, str, size, flags, layout )) >= -1) return len;
if (!(kbd_tables = user_driver->pKbdLayerDescriptor( layout ))) kbd_tables = &kbdus_tables; - if (scan & 0x8000) buffer[0] = 0; /* key up */ - else buffer[0] = kbd_tables_vkey_to_wchar( kbd_tables, virt, state ); + if (scan & 0x8000) str[0] = 0; /* key up */ + else str[0] = kbd_tables_vkey_to_wchar( kbd_tables, virt, state ); + if (size > 1) str[1] = 0;
- if (buffer[0] != WCH_NONE) len = 1; - else buffer[0] = len = 0; - - lstrcpynW( str, buffer, size ); + if (str[0] != WCH_NONE) len = 1; + else str[0] = len = 0;
if (kbd_tables != &kbdus_tables) user_driver->pReleaseKbdTables( kbd_tables );
- TRACE_(keyboard)( "ret %d, str %s.\n", len, debugstr_w(str) ); + TRACE_(keyboard)( "ret %d, str %s.\n", len, debugstr_wn(str, len) ); return len; }