Alexandre Julliard : advapi32: Don' t use the static Unicode buffer for value names since they can be larger than MAX_PATH .
Alexandre Julliard
julliard at winehq.org
Fri Apr 2 10:17:11 CDT 2010
Module: wine
Branch: master
Commit: acc41b50d123d693041b7feaa763ed4c227f9b94
URL: http://source.winehq.org/git/wine.git/?a=commit;h=acc41b50d123d693041b7feaa763ed4c227f9b94
Author: Alexandre Julliard <julliard at winehq.org>
Date: Fri Apr 2 11:50:12 2010 +0200
advapi32: Don't use the static Unicode buffer for value names since they can be larger than MAX_PATH.
---
dlls/advapi32/registry.c | 31 ++++++++++++++++++-------------
dlls/advapi32/tests/registry.c | 3 ++-
2 files changed, 20 insertions(+), 14 deletions(-)
diff --git a/dlls/advapi32/registry.c b/dlls/advapi32/registry.c
index dd3f516..9266d3f 100644
--- a/dlls/advapi32/registry.c
+++ b/dlls/advapi32/registry.c
@@ -1103,6 +1103,7 @@ LSTATUS WINAPI RegSetValueExA( HKEY hkey, LPCSTR name, DWORD reserved, DWORD typ
CONST BYTE *data, DWORD count )
{
ANSI_STRING nameA;
+ UNICODE_STRING nameW;
WCHAR *dataW = NULL;
NTSTATUS status;
@@ -1133,10 +1134,10 @@ LSTATUS WINAPI RegSetValueExA( HKEY hkey, LPCSTR name, DWORD reserved, DWORD typ
}
RtlInitAnsiString( &nameA, name );
- if (!(status = RtlAnsiStringToUnicodeString( &NtCurrentTeb()->StaticUnicodeString,
- &nameA, FALSE )))
+ if (!(status = RtlAnsiStringToUnicodeString( &nameW, &nameA, TRUE )))
{
- status = NtSetValueKey( hkey, &NtCurrentTeb()->StaticUnicodeString, 0, type, data, count );
+ status = NtSetValueKey( hkey, &nameW, 0, type, data, count );
+ RtlFreeUnicodeString( &nameW );
}
HeapFree( GetProcessHeap(), 0, dataW );
return RtlNtStatusToDosError( status );
@@ -1305,6 +1306,7 @@ LSTATUS WINAPI RegQueryValueExA( HKEY hkey, LPCSTR name, LPDWORD reserved, LPDWO
{
NTSTATUS status;
ANSI_STRING nameA;
+ UNICODE_STRING nameW;
DWORD total_size, datalen = 0;
char buffer[256], *buf_ptr = buffer;
KEY_VALUE_PARTIAL_INFORMATION *info = (KEY_VALUE_PARTIAL_INFORMATION *)buffer;
@@ -1323,12 +1325,11 @@ LSTATUS WINAPI RegQueryValueExA( HKEY hkey, LPCSTR name, LPDWORD reserved, LPDWO
if (type) *type = REG_NONE;
RtlInitAnsiString( &nameA, name );
- if ((status = RtlAnsiStringToUnicodeString( &NtCurrentTeb()->StaticUnicodeString,
- &nameA, FALSE )))
+ if ((status = RtlAnsiStringToUnicodeString( &nameW, &nameA, TRUE )))
return RtlNtStatusToDosError(status);
- status = NtQueryValueKey( hkey, &NtCurrentTeb()->StaticUnicodeString,
- KeyValuePartialInformation, buffer, sizeof(buffer), &total_size );
+ status = NtQueryValueKey( hkey, &nameW, KeyValuePartialInformation,
+ buffer, sizeof(buffer), &total_size );
if (status && status != STATUS_BUFFER_OVERFLOW) goto done;
/* we need to fetch the contents for a string type even if not requested,
@@ -1345,8 +1346,8 @@ LSTATUS WINAPI RegQueryValueExA( HKEY hkey, LPCSTR name, LPDWORD reserved, LPDWO
goto done;
}
info = (KEY_VALUE_PARTIAL_INFORMATION *)buf_ptr;
- status = NtQueryValueKey( hkey, &NtCurrentTeb()->StaticUnicodeString,
- KeyValuePartialInformation, buf_ptr, total_size, &total_size );
+ status = NtQueryValueKey( hkey, &nameW, KeyValuePartialInformation,
+ buf_ptr, total_size, &total_size );
}
if (status) goto done;
@@ -1384,6 +1385,7 @@ LSTATUS WINAPI RegQueryValueExA( HKEY hkey, LPCSTR name, LPDWORD reserved, LPDWO
done:
if (buf_ptr != buffer) HeapFree( GetProcessHeap(), 0, buf_ptr );
+ RtlFreeUnicodeString( &nameW );
return RtlNtStatusToDosError(status);
}
@@ -1955,15 +1957,18 @@ LSTATUS WINAPI RegDeleteValueW( HKEY hkey, LPCWSTR name )
*/
LSTATUS WINAPI RegDeleteValueA( HKEY hkey, LPCSTR name )
{
- STRING nameA;
+ ANSI_STRING nameA;
+ UNICODE_STRING nameW;
NTSTATUS status;
if (!(hkey = get_special_root_hkey( hkey ))) return ERROR_INVALID_HANDLE;
RtlInitAnsiString( &nameA, name );
- if (!(status = RtlAnsiStringToUnicodeString( &NtCurrentTeb()->StaticUnicodeString,
- &nameA, FALSE )))
- status = NtDeleteValueKey( hkey, &NtCurrentTeb()->StaticUnicodeString );
+ if (!(status = RtlAnsiStringToUnicodeString( &nameW, &nameA, TRUE )))
+ {
+ status = NtDeleteValueKey( hkey, &nameW );
+ RtlFreeUnicodeString( &nameW );
+ }
return RtlNtStatusToDosError( status );
}
diff --git a/dlls/advapi32/tests/registry.c b/dlls/advapi32/tests/registry.c
index d0ef19e..63ed984 100644
--- a/dlls/advapi32/tests/registry.c
+++ b/dlls/advapi32/tests/registry.c
@@ -1968,7 +1968,8 @@ static void test_delete_value(void)
memset(longname, 'a', 400);
longname[400] = 0;
res = RegDeleteValueA( hkey_main, longname );
- todo_wine ok(res == ERROR_FILE_NOT_FOUND, "expect ERROR_FILE_NOT_FOUND, got %i\n", res);
+ ok(res == ERROR_FILE_NOT_FOUND || broken(res == ERROR_MORE_DATA), /* nt4, win2k */
+ "expect ERROR_FILE_NOT_FOUND, got %i\n", res);
}
START_TEST(registry)
More information about the wine-cvs
mailing list