kernel32: Don't use HIWORD to check for swapped args in GetCurrentDirectoryA. (Resend)
Michael Stefaniuc
mstefani at redhat.de
Wed Feb 10 05:11:53 CST 2010
https://winetestbot.geldorp.nl/JobDetails.pl?Key=643 to show that
(LPSTR)(MAX_PATH+42) doesn't crashes GetCurrentDirectoryA() either.
---
Use if(0) to comment out the test (Thanks Paul).
dlls/kernel32/path.c | 4 ++--
dlls/kernel32/tests/path.c | 10 ++++++++++
2 files changed, 12 insertions(+), 2 deletions(-)
diff --git a/dlls/kernel32/path.c b/dlls/kernel32/path.c
index 0a02681..d77ecc1 100644
--- a/dlls/kernel32/path.c
+++ b/dlls/kernel32/path.c
@@ -1400,13 +1400,13 @@ UINT WINAPI GetCurrentDirectoryA( UINT buflen, LPSTR buf )
WCHAR bufferW[MAX_PATH];
DWORD ret;
- if (buflen && buf && !HIWORD(buf))
+ if (buflen && buf && ((ULONG_PTR)buf >> 16) == 0)
{
/* Win9x catches access violations here, returning zero.
* This behaviour resulted in some people not noticing
* that they got the argument order wrong. So let's be
* nice and fail gracefully if buf is invalid and looks
- * more like a buflen (which is probably MAX_PATH). */
+ * more like a buflen. */
SetLastError(ERROR_INVALID_PARAMETER);
return 0;
}
diff --git a/dlls/kernel32/tests/path.c b/dlls/kernel32/tests/path.c
index e533bd0..be01948 100644
--- a/dlls/kernel32/tests/path.c
+++ b/dlls/kernel32/tests/path.c
@@ -467,6 +467,16 @@ static void test_CurrentDirectoryA(CHAR *origdir, CHAR *newdir)
if (len) ok( !strcmp( buffer, origdir ), "wrong result %s\n", buffer );
HeapFree( GetProcessHeap(), 0, buffer );
+/* Check for crash prevention on swapped args. Crashes all but Win9x.
+*/
+ if (0)
+ {
+ SetLastError( 0xdeadbeef );
+ len = GetCurrentDirectoryA( 42, (LPSTR)(MAX_PATH + 42) );
+ ok( len == 0 && GetLastError() == ERROR_INVALID_PARAMETER,
+ "GetCurrentDirectoryA failed to fail %u err %u\n", len, GetLastError() );
+ }
+
/* SetCurrentDirectoryA shouldn't care whether the string has a
trailing '\\' or not
*/
--
1.6.4.4
More information about the wine-patches
mailing list