Module: wine Branch: master Commit: 2ce16509687079c1f95bdfd018e08c0dee36aaa8 URL: http://source.winehq.org/git/wine.git/?a=commit;h=2ce16509687079c1f95bdfd018...
Author: Sebastian Lackner sebastian@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);