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