|
|
|
@ -22,6 +22,7 @@ |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
#include "clamav.h" |
|
|
|
|
#include "others.h" |
|
|
|
|
#include "shared/output.h" |
|
|
|
|
#include "mpool.h" |
|
|
|
|
#include "clscanapi.h" |
|
|
|
@ -363,9 +364,25 @@ int CLAMAPI Scan_Initialize(const wchar_t *pEnginesFolder, const wchar_t *pTempR |
|
|
|
|
free_engine_and_unlock(); |
|
|
|
|
FAIL(CL_EARG, "Can't translate pTempRoot"); |
|
|
|
|
} |
|
|
|
|
ret = strlen(tmpdir); |
|
|
|
|
while(ret>0 && tmpdir[--ret] == '\\') |
|
|
|
|
tmpdir[ret] = '\0'; |
|
|
|
|
if(!ret || ret + 8 + 1 >= sizeof(tmpdir)) { |
|
|
|
|
free_engine_and_unlock(); |
|
|
|
|
FAIL(CL_EARG, "Bad or too long pTempRoot '%s'", tmpdir); |
|
|
|
|
} |
|
|
|
|
memcpy(&tmpdir[ret+1], "\\clamtmp", 9); |
|
|
|
|
cli_rmdirs(tmpdir); |
|
|
|
|
if(!CreateDirectory(tmpdir, NULL)) { |
|
|
|
|
ret = GetLastError(); |
|
|
|
|
if((DWORD)ret != ERROR_ALREADY_EXISTS) { |
|
|
|
|
free_engine_and_unlock(); |
|
|
|
|
FAIL(CL_ETMPDIR, "Cannot create pTempRoot '%s': error %d", ret); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
if((ret = cl_engine_set_str(engine, CL_ENGINE_TMPDIR, tmpdir))) { |
|
|
|
|
free_engine_and_unlock(); |
|
|
|
|
FAIL(ret, "Failed to set engine tempdir: %s", cl_strerror(ret)); |
|
|
|
|
FAIL(ret, "Failed to set engine tempdir to '%s': %s", tmpdir, cl_strerror(ret)); |
|
|
|
|
} |
|
|
|
|
if(!WideCharToMultiByte(CP_ACP, WC_NO_BEST_FIT_CHARS, pEnginesFolder, -1, dbdir, sizeof(dbdir), NULL, &cant_convert) || cant_convert) { |
|
|
|
|
free_engine_and_unlock(); |
|
|
|
|