[PATCH 2/2] msvcrt: fix _makepath() [try #2]

Peter Beutner p.beutner at gmx.net
Mon Aug 6 08:38:49 CDT 2007


Avoid setting the first byte of the output buffer
to '\0' as it is valid to pass the same buffer as
input and output buffer.

Fixes bug #8251
---
changes from previous try:
    use strcat to append slash after directory, so
    that the string is properly null-terminated.

---
 dlls/msvcrt/dir.c       |   26 ++++++++++++++------------
 dlls/msvcrt/tests/dir.c |    3 +--
 2 files changed, 15 insertions(+), 14 deletions(-)

diff --git a/dlls/msvcrt/dir.c b/dlls/msvcrt/dir.c
index 21a3115..8340d28 100644
--- a/dlls/msvcrt/dir.c
+++ b/dlls/msvcrt/dir.c
@@ -853,7 +853,7 @@ VOID CDECL _makepath(char * path, const char * drive,
                      const char *directory, const char * filename,
                      const char * extension)
 {
-    char ch;
+    char *p = path;
 
     TRACE("(%s %s %s %s)\n", debugstr_a(drive), debugstr_a(directory),
           debugstr_a(filename), debugstr_a(extension) );
@@ -861,28 +861,30 @@ VOID CDECL _makepath(char * path, const char * drive,
     if ( !path )
         return;
 
-    path[0] = '\0';
     if (drive && drive[0])
     {
-        path[0] = drive[0];
-        path[1] = ':';
-        path[2] = 0;
+        *p++ = drive[0];
+        *p++ = ':';
+        *p = 0;
     }
     if (directory && directory[0])
     {
-        strcat(path, directory);
-        ch = path[strlen(path)-1];
-        if (ch != '/' && ch != '\\')
-            strcat(path,"\\");
+        strcpy(p, directory);
+        p += strlen(directory) - 1;
+        if (*p != '/' && *p != '\\') {
+            strcat(p, "\\");
+            p++;
+        }
+        p++;
     }
     if (filename && filename[0])
     {
-        strcat(path, filename);
+        strcpy(p, filename);
         if (extension && extension[0])
         {
             if ( extension[0] != '.' )
-                strcat(path,".");
-            strcat(path,extension);
+                strcat(p,".");
+            strcat(p,extension);
         }
     }
     TRACE("returning %s\n",path);
diff --git a/dlls/msvcrt/tests/dir.c b/dlls/msvcrt/tests/dir.c
index f3c4d08..6929a76 100644
--- a/dlls/msvcrt/tests/dir.c
+++ b/dlls/msvcrt/tests/dir.c
@@ -43,8 +43,7 @@ static void test_makepath(void)
     /* this works with native and e.g. Freelancer depends on it */
     strcpy(buffer, "foo");
     _makepath(buffer, NULL, buffer, "dummy.txt", NULL);
-    todo_wine { ok( strcmp(buffer, "foo\\dummy.txt") == 0,
-                    "unexpected result: %s\n", buffer); }
+    ok( strcmp(buffer, "foo\\dummy.txt") == 0, "unexpected result: %s\n", buffer);
 }
 
 static void test_fullpath(void)
-- 
1.5.2.2




More information about the wine-patches mailing list