Sebastian Lackner : kernel32: Fix calculation of returned buffer in get_registry_locale_info.

Alexandre Julliard julliard at wine.codeweavers.com
Mon Apr 6 10:34:18 CDT 2015


Module: wine
Branch: master
Commit: 51c21cca9848d65948d14bd70ddf37ca2e2faf83
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=51c21cca9848d65948d14bd70ddf37ca2e2faf83

Author: Sebastian Lackner <sebastian at fds-team.de>
Date:   Fri Apr  3 14:25:57 2015 +0200

kernel32: Fix calculation of returned buffer in get_registry_locale_info.

Fixes a regression introduced by 8826ba1bc86fefa22c543608585ae8f3b4310a5f.

---

 dlls/kernel32/locale.c | 13 +++++++++++--
 1 file changed, 11 insertions(+), 2 deletions(-)

diff --git a/dlls/kernel32/locale.c b/dlls/kernel32/locale.c
index afc5b9d..7798b91 100644
--- a/dlls/kernel32/locale.c
+++ b/dlls/kernel32/locale.c
@@ -1177,6 +1177,17 @@ static INT get_registry_locale_info( struct registry_value *registry_value, LPWS
 
         status = NtQueryValueKey( hkey, &nameW, KeyValuePartialInformation, info, size, &size );
 
+        /* try again with a bigger buffer when we have to return the correct size */
+        if (status == STATUS_BUFFER_OVERFLOW && !buffer && size > info_size)
+        {
+            KEY_VALUE_PARTIAL_INFORMATION *new_info;
+            if ((new_info = HeapReAlloc( GetProcessHeap(), 0, info, size )))
+            {
+                info = new_info;
+                status = NtQueryValueKey( hkey, &nameW, KeyValuePartialInformation, info, size, &size );
+            }
+        }
+
         NtClose( hkey );
 
         if (!status)
@@ -1207,8 +1218,6 @@ static INT get_registry_locale_info( struct registry_value *registry_value, LPWS
             if (status == STATUS_BUFFER_OVERFLOW && !buffer)
             {
                 ret = (size - info_size) / sizeof(WCHAR);
-                if (!ret || ((WCHAR *)&info->Data)[ret-1])
-                    ret++;
             }
             else if (status == STATUS_OBJECT_NAME_NOT_FOUND)
             {




More information about the wine-cvs mailing list