https://git.reactos.org/?p=reactos.git;a=commitdiff;h=8236bb8f38aa72bfc4288d...
commit 8236bb8f38aa72bfc4288df570afaccb6da22a07 Author: Carlo Bramini carlo.bramix@libero.it AuthorDate: Fri Mar 2 10:14:07 2018 +0100 Commit: Pierre Schweitzer pierre@reactos.org CommitDate: Fri Nov 2 09:22:34 2018 +0100
Avoid stray temp files in failure cases of do_file_copyW. CORE-12616 --- dll/win32/setupapi/queue.c | 36 ++++++++++++++++++++++++++---------- 1 file changed, 26 insertions(+), 10 deletions(-)
diff --git a/dll/win32/setupapi/queue.c b/dll/win32/setupapi/queue.c index 060984be8f..e5919bba5c 100644 --- a/dll/win32/setupapi/queue.c +++ b/dll/win32/setupapi/queue.c @@ -1067,6 +1067,7 @@ static BOOL do_file_copyW( LPCWSTR source, LPCWSTR target, DWORD style, OFSTRUCT OfStruct; WCHAR TempPath[MAX_PATH]; WCHAR TempFile[MAX_PATH]; + LONG lRes; #endif
TRACE("copy %s to %s style 0x%x\n",debugstr_w(source),debugstr_w(target),style); @@ -1078,11 +1079,6 @@ static BOOL do_file_copyW( LPCWSTR source, LPCWSTR target, DWORD style, ERR("GetTempPathW error\n"); return FALSE; } - if (!GetTempFileNameW(TempPath, L"", 0, TempFile)) - { - ERR("GetTempFileNameW(%s) error\n", debugstr_w(TempPath)); - return FALSE; - }
/* Try to open the source file */ hSource = LZOpenFileW((LPWSTR)source, &OfStruct, OF_READ); @@ -1092,25 +1088,45 @@ static BOOL do_file_copyW( LPCWSTR source, LPCWSTR target, DWORD style, return FALSE; }
+ if (!GetTempFileNameW(TempPath, L"", 0, TempFile)) + { + ERR("GetTempFileNameW(%s) error\n", debugstr_w(TempPath)); + + /* Close the source handle */ + LZClose(hSource); + + return FALSE; + } + /* Extract the compressed file to a temp location */ hTemp = LZOpenFileW(TempFile, &OfStruct, OF_CREATE); if (hTemp < 0) { - DWORD dwLastError = GetLastError(); - ERR("LZOpenFileW(2) error %d %s\n", (int)hTemp, debugstr_w(TempFile));
/* Close the source handle */ LZClose(hSource);
- /* Restore error condition triggered by LZOpenFileW */ - SetLastError(dwLastError); + /* Delete temp file if an error is signaled */ + DeleteFileW(TempFile); + return FALSE; }
- LZCopy(hSource, hTemp); + lRes = LZCopy(hSource, hTemp); + LZClose(hSource); LZClose(hTemp); + + if (lRes < 0) + { + ERR("LZCopy error %d (%s, %s)\n", (int)lRes, debugstr_w(source), debugstr_w(TempFile)); + + /* Delete temp file if copy was not successful */ + DeleteFileW(TempFile); + + return FALSE; + } #endif
/* before copy processing */