James Hawkins : kernel32: Handle writing empty sections and keys in WritePrivateProfileString.

Alexandre Julliard julliard at winehq.org
Tue Mar 24 09:01:56 CDT 2009


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

Author: James Hawkins <truiken at gmail.com>
Date:   Sun Mar 22 14:37:44 2009 -0700

kernel32: Handle writing empty sections and keys in WritePrivateProfileString.

---

 dlls/kernel32/profile.c       |   32 ++++++++++++++++++++------------
 dlls/kernel32/tests/profile.c |    5 +----
 2 files changed, 21 insertions(+), 16 deletions(-)

diff --git a/dlls/kernel32/profile.c b/dlls/kernel32/profile.c
index fea858c..22cc445 100644
--- a/dlls/kernel32/profile.c
+++ b/dlls/kernel32/profile.c
@@ -202,31 +202,31 @@ static void PROFILE_Save( HANDLE hFile, const PROFILESECTION *section, ENCODING
 
     for ( ; section; section = section->next)
     {
-        int len = 0;
+        int len = 4;
 
-        if (section->name[0]) len += strlenW(section->name) + 6;
+        if (section->name[0]) len += strlenW(section->name);
 
         for (key = section->key; key; key = key->next)
         {
-            len += strlenW(key->name) + 2;
-            if (key->value) len += strlenW(key->value) + 1;
+            len += strlenW(key->name);
+            if (key->value && key->value[0]) len += strlenW(key->value);
+            len += 3; /* '=' and "\r\n" */
         }
 
         buffer = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR));
         if (!buffer) return;
 
         p = buffer;
+        *p++ = '[';
         if (section->name[0])
         {
-            *p++ = '\r';
-            *p++ = '\n';
-            *p++ = '[';
             strcpyW( p, section->name );
             p += strlenW(p);
-            *p++ = ']';
-            *p++ = '\r';
-            *p++ = '\n';
         }
+        *p++ = ']';
+        *p++ = '\r';
+        *p++ = '\n';
+
         for (key = section->key; key; key = key->next)
         {
             strcpyW( p, key->name );
@@ -587,12 +587,20 @@ static PROFILEKEY *PROFILE_Find( PROFILESECTION **section, LPCWSTR section_name,
     int seclen, keylen;
 
     while (PROFILE_isspaceW(*section_name)) section_name++;
-    p = section_name + strlenW(section_name) - 1;
+    if (*section_name)
+        p = section_name + strlenW(section_name) - 1;
+    else
+        p = section_name;
+
     while ((p > section_name) && PROFILE_isspaceW(*p)) p--;
     seclen = p - section_name + 1;
 
     while (PROFILE_isspaceW(*key_name)) key_name++;
-    p = key_name + strlenW(key_name) - 1;
+    if (*key_name)
+        p = key_name + strlenW(key_name) - 1;
+    else
+        p = key_name;
+
     while ((p > key_name) && PROFILE_isspaceW(*p)) p--;
     keylen = p - key_name + 1;
 
diff --git a/dlls/kernel32/tests/profile.c b/dlls/kernel32/tests/profile.c
index 0ba3fd1..9f5398c 100644
--- a/dlls/kernel32/tests/profile.c
+++ b/dlls/kernel32/tests/profile.c
@@ -930,10 +930,7 @@ static void test_WritePrivateProfileString(void)
            "key=string\r\n";
     ret = WritePrivateProfileStringA("App", "key", "string", "win1.tmp");
     ok(ret == TRUE, "Expected TRUE, got %d\n", ret);
-    todo_wine
-    {
-        ok(check_file_data(path, data), "File doesn't match\n");
-    }
+    ok(check_file_data(path, data), "File doesn't match\n");
     DeleteFileA(path);
 
     GetTempPathA(MAX_PATH, temp);




More information about the wine-cvs mailing list