Sebastian Lackner : wininet: Fix handling of subdirectory in FtpFindFirstFile.

Alexandre Julliard julliard at wine.codeweavers.com
Wed Jan 14 14:35:42 CST 2015


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

Author: Sebastian Lackner <sebastian at fds-team.de>
Date:   Tue Dec 16 01:37:12 2014 +0100

wininet: Fix handling of subdirectory in FtpFindFirstFile.

Based on a patch by Mike Ruprecht.

---

 dlls/wininet/ftp.c       | 18 +++++++++++++++++-
 dlls/wininet/tests/ftp.c | 23 +++++++++++++++++++++--
 2 files changed, 38 insertions(+), 3 deletions(-)

diff --git a/dlls/wininet/ftp.c b/dlls/wininet/ftp.c
index f45e495..64c06c3 100644
--- a/dlls/wininet/ftp.c
+++ b/dlls/wininet/ftp.c
@@ -831,6 +831,7 @@ static HINTERNET FTP_FtpFindFirstFileW(ftp_session_t *lpwfs,
     INT nResCode;
     appinfo_t *hIC = NULL;
     HINTERNET hFindNext = NULL;
+    LPWSTR lpszSearchPath = NULL;
 
     TRACE("\n");
 
@@ -846,7 +847,20 @@ static HINTERNET FTP_FtpFindFirstFileW(ftp_session_t *lpwfs,
     if (!FTP_SendPortOrPasv(lpwfs))
         goto lend;
 
-    if (!FTP_SendCommand(lpwfs->sndSocket, FTP_CMD_LIST, NULL,
+    /* split search path into file and path */
+    if (lpszSearchFile)
+    {
+        LPCWSTR name = lpszSearchFile, p;
+        if ((p = strrchrW( name, '\\' ))) name = p + 1;
+        if ((p = strrchrW( name, '/' ))) name = p + 1;
+        if (name != lpszSearchFile)
+        {
+            lpszSearchPath = heap_strndupW(lpszSearchFile, name - lpszSearchFile);
+            lpszSearchFile = name;
+        }
+    }
+
+    if (!FTP_SendCommand(lpwfs->sndSocket, FTP_CMD_LIST, lpszSearchPath,
         lpwfs->hdr.lpfnStatusCB, &lpwfs->hdr, lpwfs->hdr.dwContext))
         goto lend;
 
@@ -872,6 +886,8 @@ static HINTERNET FTP_FtpFindFirstFileW(ftp_session_t *lpwfs,
     }
 
 lend:
+    heap_free(lpszSearchPath);
+
     if (lpwfs->lstnSocket != -1)
     {
         closesocket(lpwfs->lstnSocket);
diff --git a/dlls/wininet/tests/ftp.c b/dlls/wininet/tests/ftp.c
index b88b136..567545d 100644
--- a/dlls/wininet/tests/ftp.c
+++ b/dlls/wininet/tests/ftp.c
@@ -751,6 +751,7 @@ static void test_find_first_file(HINTERNET hFtp, HINTERNET hConnect)
     HINTERNET hSearch2;
     HINTERNET hOpenFile;
     DWORD error;
+    BOOL success;
 
     /* NULL as the search file ought to return the first file in the directory */
     SetLastError(0xdeadbeef);
@@ -770,13 +771,13 @@ static void test_find_first_file(HINTERNET hFtp, HINTERNET hConnect)
     /* Try a valid filename in a subdirectory search */
     SetLastError(0xdeadbeef);
     hSearch = FtpFindFirstFileA(hFtp, "pub/wine", &findData, 0, 0);
-    todo_wine ok ( hSearch != NULL, "Expected FtpFindFirstFileA to pass\n" );
+    ok( hSearch != NULL, "Expected FtpFindFirstFileA to pass\n" );
     InternetCloseHandle(hSearch);
 
     /* Try a valid filename in a subdirectory wildcard search */
     SetLastError(0xdeadbeef);
     hSearch = FtpFindFirstFileA(hFtp, "pub/w*", &findData, 0, 0);
-    todo_wine ok ( hSearch != NULL, "Expected FtpFindFirstFileA to pass\n" );
+    ok( hSearch != NULL, "Expected FtpFindFirstFileA to pass\n" );
     InternetCloseHandle(hSearch);
 
     /* Try an invalid wildcard search */
@@ -785,6 +786,24 @@ static void test_find_first_file(HINTERNET hFtp, HINTERNET hConnect)
     ok ( hSearch == NULL, "Expected FtpFindFirstFileA to fail\n" );
     InternetCloseHandle(hSearch); /* Just in case */
 
+    /* change current directory, and repeat those tests - this shows
+     * that the search string is interpreted as relative directory. */
+    success = FtpSetCurrentDirectoryA(hFtp, "pub");
+    ok( success, "Expected FtpSetCurrentDirectory to succeed\n" );
+
+    SetLastError(0xdeadbeef);
+    hSearch = FtpFindFirstFileA(hFtp, "wine", &findData, 0, 0);
+    ok( hSearch != NULL, "Expected FtpFindFirstFileA to pass\n" );
+    InternetCloseHandle(hSearch);
+
+    SetLastError(0xdeadbeef);
+    hSearch = FtpFindFirstFileA(hFtp, "w*", &findData, 0, 0);
+    ok( hSearch != NULL, "Expected FtpFindFirstFileA to pass\n" );
+    InternetCloseHandle(hSearch);
+
+    success = FtpSetCurrentDirectoryA(hFtp, "..");
+    ok( success, "Expected FtpSetCurrentDirectory to succeed\n" );
+
     /* Try FindFirstFile between FtpOpenFile and InternetCloseHandle */
     SetLastError(0xdeadbeef);
     hOpenFile = FtpOpenFileA(hFtp, "welcome.msg", GENERIC_READ, FTP_TRANSFER_TYPE_ASCII, 0);




More information about the wine-cvs mailing list