Module: wine Branch: master Commit: 5b04d3d67d6d839a7b20e07fa7bc25bc28e19e70 URL: http://source.winehq.org/git/wine.git/?a=commit;h=5b04d3d67d6d839a7b20e07fa7...
Author: Paul Vriens paul.vriens.wine@gmail.com Date: Fri Feb 16 17:48:39 2007 +0100
wininet/ftp.c: Fix some returned error codes.
---
dlls/wininet/ftp.c | 46 ++++++++++++++++++++++++++++------------------ dlls/wininet/tests/ftp.c | 33 ++++++++++++++++++++++++++------- 2 files changed, 54 insertions(+), 25 deletions(-)
diff --git a/dlls/wininet/ftp.c b/dlls/wininet/ftp.c index e8a31b4..6bc21ff 100644 --- a/dlls/wininet/ftp.c +++ b/dlls/wininet/ftp.c @@ -64,6 +64,11 @@ WINE_DEFAULT_DEBUG_CHANNEL(wininet); #define szCRLF "\r\n" #define MAX_BACKLOG 5
+/* Testing shows that Windows only accepts dwFlags where the last + * 3 (yes 3) bits define FTP_TRANSFER_TYPE_UNKNOWN, FTP_TRANSFER_TYPE_ASCII or FTP_TRANSFER_TYPE_BINARY. + */ +#define FTP_CONDITION_MASK 0x0007 + typedef enum { /* FTP commands with arguments. */ FTP_CMD_ACCT, @@ -201,13 +206,31 @@ BOOL WINAPI FtpPutFileW(HINTERNET hConnect, LPCWSTR lpszLocalFile, LPWININETAPPINFOW hIC = NULL; BOOL r = FALSE;
+ if (!lpszLocalFile || !lpszNewRemoteFile) + { + INTERNET_SetLastError(ERROR_INVALID_PARAMETER); + return FALSE; + } + lpwfs = (LPWININETFTPSESSIONW) WININET_GetObject( hConnect ); - if (NULL == lpwfs || WH_HFTPSESSION != lpwfs->hdr.htype) + if (!lpwfs) + { + INTERNET_SetLastError(ERROR_INVALID_HANDLE); + return FALSE; + } + + if (WH_HFTPSESSION != lpwfs->hdr.htype) { INTERNET_SetLastError(ERROR_INTERNET_INCORRECT_HANDLE_TYPE); goto lend; }
+ if ((dwFlags & FTP_CONDITION_MASK) > FTP_TRANSFER_TYPE_BINARY) + { + INTERNET_SetLastError(ERROR_INVALID_PARAMETER); + goto lend; + } + hIC = lpwfs->lpAppInfo; if (hIC->hdr.dwFlags & INTERNET_FLAG_ASYNC) { @@ -230,8 +253,7 @@ BOOL WINAPI FtpPutFileW(HINTERNET hConnect, LPCWSTR lpszLocalFile, }
lend: - if( lpwfs ) - WININET_Release( &lpwfs->hdr ); + WININET_Release( &lpwfs->hdr );
return r; } @@ -256,24 +278,19 @@ BOOL WINAPI FTP_FtpPutFileW(LPWININETFTPSESSIONW lpwfs, LPCWSTR lpszLocalFile,
TRACE(" lpszLocalFile(%s) lpszNewRemoteFile(%s)\n", debugstr_w(lpszLocalFile), debugstr_w(lpszNewRemoteFile));
- if (!lpszLocalFile || !lpszNewRemoteFile) - { - INTERNET_SetLastError(ERROR_INVALID_PARAMETER); - return FALSE; - } - /* Clear any error information */ INTERNET_SetLastError(0); - hIC = lpwfs->lpAppInfo;
/* Open file to be uploaded */ if (INVALID_HANDLE_VALUE == (hFile = CreateFileW(lpszLocalFile, GENERIC_READ, 0, 0, OPEN_EXISTING, 0, 0))) { INTERNET_SetLastError(ERROR_FILE_NOT_FOUND); - goto lend; + return FALSE; }
+ hIC = lpwfs->lpAppInfo; + SendAsyncCallback(&lpwfs->hdr, lpwfs->hdr.dwContext, INTERNET_STATUS_SENDING_REQUEST, NULL, 0);
if (FTP_SendStore(lpwfs, lpszNewRemoteFile, dwFlags)) @@ -296,7 +313,6 @@ BOOL WINAPI FTP_FtpPutFileW(LPWININETFTPSESSIONW lpwfs, LPCWSTR lpszLocalFile, } }
-lend: if (lpwfs->lstnSocket != -1) closesocket(lpwfs->lstnSocket);
@@ -1193,8 +1209,6 @@ static void AsyncFtpGetFileProc(WORKREQUEST *workRequest) HeapFree(GetProcessHeap(), 0, req->lpszNewFile); }
-#define FTP_CONDITION_MASK 0x0007 - BOOL WINAPI FtpGetFileW(HINTERNET hInternet, LPCWSTR lpszRemoteFile, LPCWSTR lpszNewFile, BOOL fFailIfExists, DWORD dwLocalFlagsAttribute, DWORD dwInternetFlags, DWORD dwContext) @@ -1222,10 +1236,6 @@ BOOL WINAPI FtpGetFileW(HINTERNET hInternet, LPCWSTR lpszRemoteFile, LPCWSTR lps goto lend; }
- /* Testing shows that Windows only accepts dwInternetFlags where the last - * 3 (yes 3) bits define FTP_TRANSFER_TYPE_UNKNOWN, FTP_TRANSFER_TYPE_ASCII or FTP_TRANSFER_TYPE_BINARY. - */ - if ((dwInternetFlags & FTP_CONDITION_MASK) > FTP_TRANSFER_TYPE_BINARY) { INTERNET_SetLastError(ERROR_INVALID_PARAMETER); diff --git a/dlls/wininet/tests/ftp.c b/dlls/wininet/tests/ftp.c index 43be942..840d91b 100644 --- a/dlls/wininet/tests/ftp.c +++ b/dlls/wininet/tests/ftp.c @@ -245,7 +245,7 @@ static void test_getfile(void) * Condition flags */
- /* Test to show existence of local file is tested first (together with 'remote file') */ + /* Test to show validity of 'local file' parameter is tested first (together with 'remote file') */ SetLastError(0xdeadbeef); bRet = FtpGetFileA(NULL, NULL, "should_be_non_existing_deadbeef", FALSE, FILE_ATTRIBUTE_NORMAL, FTP_TRANSFER_TYPE_UNKNOWN, 0); ok ( bRet == FALSE, "Expected FtpGetFileA to fail\n"); @@ -519,11 +519,25 @@ static void test_putfile(void) HINTERNET hInternet, hFtp, hConnect; HANDLE hFile;
- /* Invalid internet handle, the rest are valid parameters */ + /* The order of checking is: + * + * All parameters except 'session handle' and 'condition flags' + * Session handle + * Session handle type + * Condition flags + */ + + /* Test to show validity of 'local file' parameter is tested first (together with 'remote file') */ SetLastError(0xdeadbeef); - bRet = FtpPutFileA(NULL, "non_existing_local", "non_existing_remote", FTP_TRANSFER_TYPE_UNKNOWN, 0); + bRet = FtpPutFileA(NULL, NULL, "non_existing_remote", FTP_TRANSFER_TYPE_UNKNOWN, 0); + ok ( bRet == FALSE, "Expected FtpPutFileA to fail\n"); + ok ( GetLastError() == ERROR_INVALID_PARAMETER, + "Expected ERROR_INVALID_PARAMETER, got %d\n", GetLastError()); + + /* Test to show session handle is checked before 'condition flags' */ + SetLastError(0xdeadbeef); + bRet = FtpPutFileA(NULL, "non_existing_local", "non_existing_remote", 5, 0); ok ( bRet == FALSE, "Expected FtpPutFileA to fail\n"); - todo_wine ok ( GetLastError() == ERROR_INVALID_HANDLE, "Expected ERROR_INVALID_HANDLE, got %d\n", GetLastError());
@@ -556,7 +570,6 @@ static void test_putfile(void) SetLastError(0xdeadbeef); bRet = FtpPutFileA(hFtp, "non_existing_local", "non_existing_remote", 5, 0); ok ( bRet == FALSE, "Expected FtpPutFileA to fail\n"); - todo_wine ok ( GetLastError() == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %d\n", GetLastError());
@@ -564,7 +577,6 @@ static void test_putfile(void) SetLastError(0xdeadbeef); bRet = FtpPutFileA(hFtp, "non_existing_local", "non_existing_remote", FTP_TRANSFER_TYPE_UNKNOWN, 0); ok ( bRet == FALSE, "Expected FtpPutFileA to fail\n"); - todo_wine ok ( GetLastError() == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %d\n", GetLastError());
@@ -590,7 +602,14 @@ static void test_putfile(void)
hConnect = InternetConnect(hInternet, "www.winehq.org", INTERNET_DEFAULT_HTTP_PORT, NULL, NULL, INTERNET_SERVICE_HTTP, 0, 0);
- /* One small test to show that handle type is checked before parameters */ + /* Test to show validity of 'local file' parameter is tested a before 'session handle type' */ + SetLastError(0xdeadbeef); + bRet = FtpPutFileA(hConnect, NULL, "non_existing_remote", FTP_TRANSFER_TYPE_UNKNOWN, 0); + ok ( bRet == FALSE, "Expected FtpPutFileA to fail\n"); + ok ( GetLastError() == ERROR_INVALID_PARAMETER, + "Expected ERROR_INVALID_PARAMETER, got %d\n", GetLastError()); + + /* Test to show that 'session handle type' is checked before 'condition flags' */ SetLastError(0xdeadbeef); bRet = FtpPutFileA(hConnect, "non_existing_local", "non_existing_remote", 5, 0); ok ( bRet == FALSE, "Expected FtpPutFileA to fail\n");