diff --git a/dlls/msi/install.c b/dlls/msi/install.c index bb7b5b8045f..6c921b6d112 100644 --- a/dlls/msi/install.c +++ b/dlls/msi/install.c @@ -296,31 +296,23 @@ UINT WINAPI MsiGetSourcePathW( MSIHANDLE hInstall, LPCWSTR szFolder, /*********************************************************************** * MsiSetTargetPathA (MSI.@) */ -UINT WINAPI MsiSetTargetPathA(MSIHANDLE hInstall, LPCSTR szFolder, - LPCSTR szFolderPath) +UINT WINAPI MsiSetTargetPathA( MSIHANDLE hInstall, LPCSTR szFolder, + LPCSTR szFolderPath ) { - LPWSTR szwFolder; - LPWSTR szwFolderPath; - UINT rc; + LPWSTR szwFolder = NULL, szwFolderPath = NULL; + UINT rc = ERROR_OUTOFMEMORY; - if (!szFolder) - return ERROR_FUNCTION_FAILED; - if (hInstall == 0) - return ERROR_FUNCTION_FAILED; + if ( !szFolder || !szFolderPath ) + return ERROR_INVALID_PARAMETER; szwFolder = strdupAtoW(szFolder); - if (!szwFolder) - return ERROR_FUNCTION_FAILED; - szwFolderPath = strdupAtoW(szFolderPath); - if (!szwFolderPath) - { - msi_free(szwFolder); - return ERROR_FUNCTION_FAILED; - } + if (!szwFolder || !szwFolderPath) + goto end; - rc = MsiSetTargetPathW(hInstall, szwFolder, szwFolderPath); + rc = MsiSetTargetPathW( hInstall, szwFolder, szwFolderPath ); +end: msi_free(szwFolder); msi_free(szwFolderPath); @@ -342,12 +334,6 @@ UINT MSI_SetTargetPathW(MSIPACKAGE *package, LPCWSTR szFolder, TRACE("(%p %s %s)\n",package, debugstr_w(szFolder),debugstr_w(szFolderPath)); - if (package==NULL) - return ERROR_INVALID_HANDLE; - - if (szFolderPath[0]==0) - return ERROR_FUNCTION_FAILED; - attrib = GetFileAttributesW(szFolderPath); if ( attrib != INVALID_FILE_ATTRIBUTES && (!(attrib & FILE_ATTRIBUTE_DIRECTORY) || @@ -356,9 +342,8 @@ UINT MSI_SetTargetPathW(MSIPACKAGE *package, LPCWSTR szFolder, return ERROR_FUNCTION_FAILED; path = resolve_folder(package,szFolder,FALSE,FALSE,&folder); - if (!path) - return ERROR_INVALID_PARAMETER; + return ERROR_DIRECTORY; if (attrib == INVALID_FILE_ATTRIBUTES) { @@ -416,7 +401,13 @@ UINT WINAPI MsiSetTargetPathW(MSIHANDLE hInstall, LPCWSTR szFolder, TRACE("(%s %s)\n",debugstr_w(szFolder),debugstr_w(szFolderPath)); + if ( !szFolder || !szFolderPath ) + return ERROR_INVALID_PARAMETER; + package = msihandle2msiinfo(hInstall, MSIHANDLETYPE_PACKAGE); + if (!package) + return ERROR_INVALID_HANDLE; + ret = MSI_SetTargetPathW( package, szFolder, szFolderPath ); msiobj_release( &package->hdr ); return ret; diff --git a/dlls/msi/tests/package.c b/dlls/msi/tests/package.c index fa22e808de2..84b371a175b 100644 --- a/dlls/msi/tests/package.c +++ b/dlls/msi/tests/package.c @@ -326,6 +326,29 @@ static void test_gettargetpath_bad(void) MsiCloseHandle( hpkg ); } +void test_settargetpath_bad(void) +{ + MSIHANDLE hpkg; + UINT r; + + hpkg = package_from_db(create_package_db()); + ok( hpkg, "failed to create package\n"); + + r = MsiSetTargetPath( 0, NULL, NULL ); + ok( r == ERROR_INVALID_PARAMETER, "wrong return val\n"); + + r = MsiSetTargetPath( 0, "boo", "C:\\bogusx" ); + ok( r == ERROR_INVALID_HANDLE, "wrong return val\n"); + + r = MsiSetTargetPath( hpkg, "boo", NULL ); + ok( r == ERROR_INVALID_PARAMETER, "wrong return val\n"); + + r = MsiSetTargetPath( hpkg, "boo", "c:\\bogusx" ); + ok( r == ERROR_DIRECTORY, "wrong return val\n"); + + MsiCloseHandle( hpkg ); +} + void test_condition(void) { MSICONDITION r; @@ -696,5 +719,6 @@ START_TEST(package) test_getsourcepath(); test_doaction(); test_gettargetpath_bad(); + test_settargetpath_bad(); test_props(); }