Fix parameter validation in WM_GETTEXT and GetWindowText.
Modified: trunk/reactos/lib/user32/windows/defwnd.c
Modified: trunk/reactos/lib/user32/windows/window.c
_____
Modified: trunk/reactos/lib/user32/windows/defwnd.c
--- trunk/reactos/lib/user32/windows/defwnd.c 2005-09-20 09:28:49 UTC
(rev 17943)
+++ trunk/reactos/lib/user32/windows/defwnd.c 2005-09-20 09:31:13 UTC
(rev 17944)
@@ -1426,10 +1426,6 @@
LPSTR AnsiBuffer = (LPSTR)lParam;
INT Length;
- if (wParam > 1)
- {
- *((PWSTR)lParam) = '\0';
- }
Buffer = HeapAlloc(GetProcessHeap(), 0, wParam *
sizeof(WCHAR));
if (!Buffer)
return FALSE;
@@ -1505,10 +1501,6 @@
case WM_GETTEXT:
{
- if (wParam > 1)
- {
- *((PWSTR)lParam) = L'\0';
- }
return (LRESULT)NtUserInternalGetWindowText(hWnd,
(PWSTR)lParam, wParam);
}
_____
Modified: trunk/reactos/lib/user32/windows/window.c
--- trunk/reactos/lib/user32/windows/window.c 2005-09-20 09:28:49 UTC
(rev 17943)
+++ trunk/reactos/lib/user32/windows/window.c 2005-09-20 09:31:13 UTC
(rev 17944)
@@ -819,39 +819,36 @@
int STDCALL
GetWindowTextA(HWND hWnd, LPSTR lpString, int nMaxCount)
{
- DWORD ProcessId;
- if(!NtUserGetWindowThreadProcessId(hWnd, &ProcessId))
- {
- return 0;
- }
+ DWORD ProcessId;
+
+ if (lpString == NULL)
+ return 0;
- if(ProcessId != GetCurrentProcessId())
- {
- /* do not send WM_GETTEXT messages to other processes */
- LPWSTR Buffer;
- INT Length;
+ if (!NtUserGetWindowThreadProcessId(hWnd, &ProcessId))
+ return 0;
- if (nMaxCount > 1)
- {
- *((PWSTR)lpString) = '\0';
- }
- Buffer = HeapAlloc(GetProcessHeap(), 0, nMaxCount * sizeof(WCHAR));
- if (!Buffer)
- return FALSE;
- Length = NtUserInternalGetWindowText(hWnd, Buffer, nMaxCount);
- if (Length > 0 && nMaxCount > 0 &&
- !WideCharToMultiByte(CP_ACP, 0, Buffer, -1,
- lpString, nMaxCount, NULL, NULL))
- {
- lpString[0] = '\0';
- }
+ if (ProcessId != GetCurrentProcessId())
+ {
+ /* do not send WM_GETTEXT messages to other processes */
+ LPWSTR Buffer;
+ INT Length;
- HeapFree(GetProcessHeap(), 0, Buffer);
+ Buffer = HeapAlloc(GetProcessHeap(), 0, nMaxCount *
sizeof(WCHAR));
+ if (!Buffer)
+ return FALSE;
+ Length = NtUserInternalGetWindowText(hWnd, Buffer, nMaxCount);
+ if (Length > 0 && nMaxCount > 0 &&
+ !WideCharToMultiByte(CP_ACP, 0, Buffer, -1,
+ lpString, nMaxCount, NULL, NULL))
+ {
+ lpString[0] = '\0';
+ }
+ HeapFree(GetProcessHeap(), 0, Buffer);
- return (LRESULT)Length;
- }
+ return (LRESULT)Length;
+ }
- return(SendMessageA(hWnd, WM_GETTEXT, nMaxCount, (LPARAM)lpString));
+ return SendMessageA(hWnd, WM_GETTEXT, nMaxCount, (LPARAM)lpString);
}
@@ -903,29 +900,20 @@
* @implemented
*/
int STDCALL
-GetWindowTextW(
- HWND hWnd,
- LPWSTR lpString,
- int nMaxCount)
+GetWindowTextW(HWND hWnd, LPWSTR lpString, int nMaxCount)
{
- DWORD ProcessId;
- if(!NtUserGetWindowThreadProcessId(hWnd, &ProcessId))
- {
- return 0;
- }
+ DWORD ProcessId;
+
+ if (lpString == NULL)
+ return 0;
- if(ProcessId == GetCurrentProcessId())
- {
- return(SendMessageW(hWnd, WM_GETTEXT, nMaxCount,
(LPARAM)lpString));
- }
+ if (!NtUserGetWindowThreadProcessId(hWnd, &ProcessId))
+ return 0;
- /* do not send WM_GETTEXT messages to other processes */
- if (nMaxCount > 1)
- {
- *((PWSTR)lpString) = L'\0';
- }
+ if (ProcessId == GetCurrentProcessId())
+ return SendMessageW(hWnd, WM_GETTEXT, nMaxCount,
(LPARAM)lpString);
- return (LRESULT)NtUserInternalGetWindowText(hWnd, (PWSTR)lpString,
nMaxCount);
+ return NtUserInternalGetWindowText(hWnd, lpString, nMaxCount);
}
DWORD STDCALL