kernel32: fix PROFILE_Load to handle mac line endings (try 4)

Erik Inge Bolsø knan-wine at anduin.net
Sun Sep 21 09:49:16 CDT 2008


Fixes bug 15281. With testcase.
---
 dlls/kernel32/profile.c       |    1 +
 dlls/kernel32/tests/profile.c |   32 +++++++++++++++++++++-----------
 2 files changed, 22 insertions(+), 11 deletions(-)

Testcase has been run on win2k by Nicolas Le Cam:
http://www.winehq.org/pipermail/wine-devel/2008-September/069107.html

Change from v1: removed unneeded hunk, ref Michael Karcher
Change from v2: refactored testcase, ref Paul Vriens
Change from v3: cleaned up testcase further, ref Michael Karcher

diff --git a/dlls/kernel32/profile.c b/dlls/kernel32/profile.c
index ab26533..3ed2dcd 100644
--- a/dlls/kernel32/profile.c
+++ b/dlls/kernel32/profile.c
@@ -405,6 +405,7 @@ static PROFILESECTION *PROFILE_Load(HANDLE hFile, ENCODING * pEncoding)
     {
         szLineStart = next_line;
         next_line = memchrW(szLineStart, '\n', szEnd - szLineStart);
+        if (!next_line) next_line = memchrW(szLineStart, '\r', szEnd - szLineStart);
         if (!next_line) next_line = szEnd;
         else next_line++;
         szLineEnd = next_line;
diff --git a/dlls/kernel32/tests/profile.c b/dlls/kernel32/tests/profile.c
index 8a3e83b..2a9f08a 100644
--- a/dlls/kernel32/tests/profile.c
+++ b/dlls/kernel32/tests/profile.c
@@ -428,7 +428,7 @@ static BOOL emptystr_ok(CHAR emptystr[MAX_PATH])
     return TRUE;
 }
 
-static void test_GetPrivateProfileString(void)
+static void test_GetPrivateProfileString(const char *content, const char *descript)
 {
     DWORD ret;
     CHAR buf[MAX_PATH];
@@ -441,15 +441,10 @@ static void test_GetPrivateProfileString(void)
     LPSTR tempfile;
 
     static const char filename[] = ".\\winetest.ini";
-    static const char content[]=
-        "[section1]\r\n"
-        "name1=val1\r\n"
-        "name2=\"val2\"\r\n"
-        "name3\r\n"
-        "name4=a\r\n"
-        "[section2]\r\n";
 
-    create_test_file(filename, content, sizeof(content));
+    trace("test_GetPrivateProfileStringA: %s\n", descript);
+
+    create_test_file(filename, content, lstrlenA(content));
 
     /* Run this test series with caching. Wine won't cache profile
        files younger than 2.1 seconds. */
@@ -674,7 +669,7 @@ static void test_GetPrivateProfileString(void)
     GetWindowsDirectoryA(windir, MAX_PATH);
     GetTempFileNameA(windir, "pre", 0, path);
     tempfile = strrchr(path, '\\') + 1;
-    create_test_file(path, content, sizeof(content));
+    create_test_file(path, content, lstrlenA(content));
 
     /* only filename is used, file exists in windows directory */
     lstrcpyA(buf, "kumquat");
@@ -703,5 +698,20 @@ START_TEST(profile)
     test_profile_existing();
     test_profile_delete_on_close();
     test_profile_refresh();
-    test_GetPrivateProfileString();
+    test_GetPrivateProfileString(
+        "[section1]\r\n"
+        "name1=val1\r\n"
+        "name2=\"val2\"\r\n"
+        "name3\r\n"
+        "name4=a\r\n"
+        "[section2]\r\n",
+        "CR+LF");
+    test_GetPrivateProfileString(
+        "[section1]\r"
+        "name1=val1\r"
+        "name2=\"val2\"\r"
+        "name3\r"
+        "name4=a\r"
+        "[section2]\r",
+        "CR only");
 }
-- 
1.5.4.3



More information about the wine-patches mailing list