| ... | ... |
@@ -1,3 +1,8 @@ |
| 1 |
+Fri Nov 14 22:24:44 CET 2008 (tk) |
|
| 2 |
+--------------------------------- |
|
| 3 |
+ * libclamav: drop cl_settempdir(); use cl_engine_set() with CL_ENGINE_TMPDIR |
|
| 4 |
+ and CL_ENGINE_KEEPTMP instead |
|
| 5 |
+ |
|
| 1 | 6 |
Fri Nov 14 18:40:50 EET 2008 (edwin) |
| 2 | 7 |
------------------------------------ |
| 3 | 8 |
* libclamunrar/unrar.c: avoid rar_malloc warnings on damaged files |
| ... | ... |
@@ -1815,7 +1815,13 @@ main(int argc, char **argv) |
| 1815 | 1815 |
/* set the temporary dir */ |
| 1816 | 1816 |
if((cpt = cfgopt(copt, "TemporaryDirectory")) && cpt->enabled) {
|
| 1817 | 1817 |
tmpdir = cpt->strarg; |
| 1818 |
- cl_settempdir(tmpdir, (short)(cfgopt(copt, "LeaveTemporaryFiles")->enabled)); |
|
| 1818 |
+ /* |
|
| 1819 |
+ * FIXME: replace this: |
|
| 1820 |
+ cl_settempdir(tmpdir, (short)(cfgopt(copt, "LeaveTemporaryFiles")->enabled)); * |
|
| 1821 |
+ * with: |
|
| 1822 |
+ * cl_engine_set(engine, CL_ENGINE_TMPDIR, cpt->strarg); |
|
| 1823 |
+ * somewhere... |
|
| 1824 |
+ */ |
|
| 1819 | 1825 |
} else if((tmpdir = getenv("TMPDIR")) == (char *)NULL)
|
| 1820 | 1826 |
if((tmpdir = getenv("TMP")) == (char *)NULL)
|
| 1821 | 1827 |
if((tmpdir = getenv("TEMP")) == (char *)NULL)
|
| ... | ... |
@@ -5809,7 +5815,7 @@ quit(void) |
| 5809 | 5809 |
#endif |
| 5810 | 5810 |
} |
| 5811 | 5811 |
|
| 5812 |
- if(tmpdir && !cli_leavetemps_flag) |
|
| 5812 |
+ if(tmpdir) |
|
| 5813 | 5813 |
if(rmdir(tmpdir) < 0) |
| 5814 | 5814 |
perror(tmpdir); |
| 5815 | 5815 |
|
| ... | ... |
@@ -293,13 +293,6 @@ int main(int argc, char **argv) |
| 293 | 293 |
return 1; |
| 294 | 294 |
} |
| 295 | 295 |
|
| 296 |
- /* set the temporary dir */ |
|
| 297 |
- if((cpt = cfgopt(copt, "TemporaryDirectory"))->enabled) |
|
| 298 |
- cl_settempdir(cpt->strarg, 0); |
|
| 299 |
- |
|
| 300 |
- if(cfgopt(copt, "LeaveTemporaryFiles")->enabled) |
|
| 301 |
- cl_settempdir(NULL, 1); |
|
| 302 |
- |
|
| 303 | 296 |
logg("#clamd daemon %s (OS: "TARGET_OS_TYPE", ARCH: "TARGET_ARCH_TYPE", CPU: "TARGET_CPU_TYPE")\n", get_version());
|
| 304 | 297 |
|
| 305 | 298 |
#ifndef C_WINDOWS |
| ... | ... |
@@ -395,6 +388,22 @@ int main(int argc, char **argv) |
| 395 | 395 |
logg("#Not loading PUA signatures.\n");
|
| 396 | 396 |
} |
| 397 | 397 |
|
| 398 |
+ /* set the temporary dir */ |
|
| 399 |
+ if((cpt = cfgopt(copt, "TemporaryDirectory"))->enabled) {
|
|
| 400 |
+ if((ret = cl_engine_set(engine, CL_ENGINE_TMPDIR, cpt->strarg))) {
|
|
| 401 |
+ logg("!cli_engine_set(CL_ENGINE_TMPDIR) failed: %s\n", cl_strerror(ret));
|
|
| 402 |
+ logg_close(); |
|
| 403 |
+ freecfg(copt); |
|
| 404 |
+ cl_engine_free(engine); |
|
| 405 |
+ return 1; |
|
| 406 |
+ } |
|
| 407 |
+ } |
|
| 408 |
+ |
|
| 409 |
+ if(cfgopt(copt, "LeaveTemporaryFiles")->enabled) {
|
|
| 410 |
+ val32 = 1; |
|
| 411 |
+ cl_engine_set(engine, CL_ENGINE_KEEPTMP, &val32); |
|
| 412 |
+ } |
|
| 413 |
+ |
|
| 398 | 414 |
if(cfgopt(copt, "PhishingSignatures")->enabled) |
| 399 | 415 |
dboptions |= CL_DB_PHISHING; |
| 400 | 416 |
else |
| ... | ... |
@@ -546,7 +546,7 @@ int scanstream(int odesc, unsigned long int *scanned, const struct cl_engine *en |
| 546 | 546 |
snprintf(peer_addr, sizeof(peer_addr), "%s", inet_ntoa(peer.sin_addr)); |
| 547 | 547 |
logg("*Accepted connection from %s on port %u, fd %d\n", peer_addr, port, acceptd);
|
| 548 | 548 |
|
| 549 |
- if(cli_gentempfd(NULL, &tmpname, &tmpd)) {
|
|
| 549 |
+ if(cli_gentempfd(cfgopt(copt, "TemporaryDirectory")->strarg, &tmpname, &tmpd)) {
|
|
| 550 | 550 |
shutdown(sockfd, 2); |
| 551 | 551 |
closesocket(sockfd); |
| 552 | 552 |
closesocket(acceptd); |
| ... | ... |
@@ -135,12 +135,6 @@ int main(int argc, char **argv) |
| 135 | 135 |
if(opt_check(opt, "bell")) |
| 136 | 136 |
bell = 1; |
| 137 | 137 |
|
| 138 |
- if(opt_check(opt, "tempdir")) |
|
| 139 |
- cl_settempdir(opt_arg(opt, "tempdir"), 0); |
|
| 140 |
- |
|
| 141 |
- if(opt_check(opt, "leave-temps")) |
|
| 142 |
- cl_settempdir(NULL, 1); |
|
| 143 |
- |
|
| 144 | 138 |
/* initialize logger */ |
| 145 | 139 |
if(opt_check(opt, "log")) {
|
| 146 | 140 |
logg_file = opt_arg(opt, "log"); |
| ... | ... |
@@ -278,7 +278,7 @@ static int scandirs(const char *dirname, struct cl_engine *engine, const struct |
| 278 | 278 |
|
| 279 | 279 |
} |
| 280 | 280 |
|
| 281 |
-static int scanstdin(const struct cl_engine *engine, int options) |
|
| 281 |
+static int scanstdin(const struct cl_engine *engine, const struct optstruct *opt, int options) |
|
| 282 | 282 |
{
|
| 283 | 283 |
int ret; |
| 284 | 284 |
const char *virname, *tmpdir; |
| ... | ... |
@@ -286,16 +286,19 @@ static int scanstdin(const struct cl_engine *engine, int options) |
| 286 | 286 |
size_t bread; |
| 287 | 287 |
FILE *fs; |
| 288 | 288 |
|
| 289 |
+ if(opt_check(opt, "tempdir")) {
|
|
| 290 |
+ tmpdir = opt_arg(opt, "tempdir"); |
|
| 291 |
+ } else {
|
|
| 292 |
+ /* check write access */ |
|
| 293 |
+ tmpdir = getenv("TMPDIR");
|
|
| 289 | 294 |
|
| 290 |
- /* check write access */ |
|
| 291 |
- tmpdir = getenv("TMPDIR");
|
|
| 292 |
- |
|
| 293 |
- if(tmpdir == NULL) |
|
| 295 |
+ if(tmpdir == NULL) |
|
| 294 | 296 |
#ifdef P_tmpdir |
| 295 |
- tmpdir = P_tmpdir; |
|
| 297 |
+ tmpdir = P_tmpdir; |
|
| 296 | 298 |
#else |
| 297 |
- tmpdir = "/tmp"; |
|
| 299 |
+ tmpdir = "/tmp"; |
|
| 298 | 300 |
#endif |
| 301 |
+ } |
|
| 299 | 302 |
|
| 300 | 303 |
if(checkaccess(tmpdir, CLAMAVUSER, W_OK) != 1) {
|
| 301 | 304 |
logg("!Can't write to temporary directory\n");
|
| ... | ... |
@@ -349,6 +352,7 @@ int scanmanager(const struct optstruct *opt) |
| 349 | 349 |
struct cl_engine *engine; |
| 350 | 350 |
struct stat sb; |
| 351 | 351 |
char *file, cwd[1024], *pua_cats = NULL, *argument; |
| 352 |
+ const char *pt; |
|
| 352 | 353 |
const struct optnode *optnode; |
| 353 | 354 |
#ifndef C_WINDOWS |
| 354 | 355 |
struct rlimit rlim; |
| ... | ... |
@@ -448,6 +452,20 @@ int scanmanager(const struct optstruct *opt) |
| 448 | 448 |
cl_engine_set(engine, CL_ENGINE_AC_MAXDEPTH, &val32); |
| 449 | 449 |
} |
| 450 | 450 |
|
| 451 |
+ if(opt_check(opt, "leave-temps")) {
|
|
| 452 |
+ val32 = 1; |
|
| 453 |
+ cl_engine_set(engine, CL_ENGINE_KEEPTMP, &val32); |
|
| 454 |
+ } |
|
| 455 |
+ |
|
| 456 |
+ if(opt_check(opt, "tempdir")) {
|
|
| 457 |
+ pt = opt_arg(opt, "tempdir"); |
|
| 458 |
+ if((ret = cl_engine_set(engine, CL_ENGINE_TMPDIR, pt))) {
|
|
| 459 |
+ logg("!cli_engine_set(CL_ENGINE_TMPDIR) failed: %s\n", cl_strerror(ret));
|
|
| 460 |
+ cl_engine_free(engine); |
|
| 461 |
+ return 50; |
|
| 462 |
+ } |
|
| 463 |
+ } |
|
| 464 |
+ |
|
| 451 | 465 |
if(opt_check(opt, "database")) {
|
| 452 | 466 |
if((ret = cl_load(opt_arg(opt, "database"), engine, &info.sigs, dboptions))) {
|
| 453 | 467 |
logg("!%s\n", cl_strerror(ret));
|
| ... | ... |
@@ -656,7 +674,7 @@ int scanmanager(const struct optstruct *opt) |
| 656 | 656 |
ret = scandirs(cwd, engine, opt, options, 1); |
| 657 | 657 |
|
| 658 | 658 |
} else if(!strcmp(opt->filename, "-")) { /* read data from stdin */
|
| 659 |
- ret = scanstdin(engine, options); |
|
| 659 |
+ ret = scanstdin(engine, opt, options); |
|
| 660 | 660 |
|
| 661 | 661 |
} else {
|
| 662 | 662 |
for (x = 0; (file = cli_strtok(opt->filename, x, "\t")) != NULL; x++) {
|
| ... | ... |
@@ -367,19 +367,19 @@ static int ea05(int desc, cli_ctx *ctx, char *tmpd) {
|
| 367 | 367 |
return CL_EIO; |
| 368 | 368 |
} |
| 369 | 369 |
free(UNP.outputbuf); |
| 370 |
- if(cli_leavetemps_flag) |
|
| 370 |
+ if(ctx->engine->keeptmp) |
|
| 371 | 371 |
cli_dbgmsg("autoit: file extracted to %s\n", tempfile);
|
| 372 | 372 |
else |
| 373 | 373 |
cli_dbgmsg("autoit: file successfully extracted\n");
|
| 374 | 374 |
lseek(i, 0, SEEK_SET); |
| 375 | 375 |
if(cli_magic_scandesc(i, ctx) == CL_VIRUS) {
|
| 376 | 376 |
close(i); |
| 377 |
- if(!cli_leavetemps_flag) |
|
| 377 |
+ if(!ctx->engine->keeptmp) |
|
| 378 | 378 |
if(cli_unlink(tempfile)) return CL_EIO; |
| 379 | 379 |
return CL_VIRUS; |
| 380 | 380 |
} |
| 381 | 381 |
close(i); |
| 382 |
- if(!cli_leavetemps_flag) |
|
| 382 |
+ if(!ctx->engine->keeptmp) |
|
| 383 | 383 |
if (cli_unlink(tempfile)) return CL_EIO; |
| 384 | 384 |
} |
| 385 | 385 |
return ret; |
| ... | ... |
@@ -877,19 +877,19 @@ static int ea06(int desc, cli_ctx *ctx, char *tmpd) {
|
| 877 | 877 |
return CL_EIO; |
| 878 | 878 |
} |
| 879 | 879 |
free(buf); |
| 880 |
- if(cli_leavetemps_flag) |
|
| 880 |
+ if(ctx->engine->keeptmp) |
|
| 881 | 881 |
cli_dbgmsg("autoit: %s extracted to %s\n", (script)?"script":"file", tempfile);
|
| 882 | 882 |
else |
| 883 | 883 |
cli_dbgmsg("autoit: %s successfully extracted\n", (script)?"script":"file");
|
| 884 | 884 |
lseek(i, 0, SEEK_SET); |
| 885 | 885 |
if(cli_magic_scandesc(i, ctx) == CL_VIRUS) {
|
| 886 | 886 |
close(i); |
| 887 |
- if(!cli_leavetemps_flag) |
|
| 887 |
+ if(!ctx->engine->keeptmp) |
|
| 888 | 888 |
if (cli_unlink(tempfile)) return CL_EIO; |
| 889 | 889 |
return CL_VIRUS; |
| 890 | 890 |
} |
| 891 | 891 |
close(i); |
| 892 |
- if(!cli_leavetemps_flag) |
|
| 892 |
+ if(!ctx->engine->keeptmp) |
|
| 893 | 893 |
if (cli_unlink(tempfile)) return CL_EIO; |
| 894 | 894 |
} |
| 895 | 895 |
return ret; |
| ... | ... |
@@ -912,14 +912,14 @@ int cli_scanautoit(int desc, cli_ctx *ctx, off_t offset) {
|
| 912 | 912 |
|
| 913 | 913 |
cli_dbgmsg("in scanautoit()\n");
|
| 914 | 914 |
|
| 915 |
- if (!(tmpd = cli_gentemp(NULL))) |
|
| 915 |
+ if (!(tmpd = cli_gentemp(ctx->engine->tmpdir))) |
|
| 916 | 916 |
return CL_ETMPDIR; |
| 917 | 917 |
if (mkdir(tmpd, 0700)) {
|
| 918 | 918 |
cli_dbgmsg("autoit: Can't create temporary directory %s\n", tmpd);
|
| 919 | 919 |
free(tmpd); |
| 920 | 920 |
return CL_ETMPDIR; |
| 921 | 921 |
} |
| 922 |
- if (cli_leavetemps_flag) |
|
| 922 |
+ if (ctx->engine->keeptmp) |
|
| 923 | 923 |
cli_dbgmsg("autoit: Extracting files to %s\n", tmpd);
|
| 924 | 924 |
|
| 925 | 925 |
switch(version) {
|
| ... | ... |
@@ -940,7 +940,7 @@ int cli_scanautoit(int desc, cli_ctx *ctx, off_t offset) {
|
| 940 | 940 |
r = CL_CLEAN; |
| 941 | 941 |
} |
| 942 | 942 |
|
| 943 |
- if (!cli_leavetemps_flag) |
|
| 943 |
+ if (!ctx->engine->keeptmp) |
|
| 944 | 944 |
cli_rmdirs(tmpd); |
| 945 | 945 |
|
| 946 | 946 |
free(tmpd); |
| ... | ... |
@@ -407,7 +407,7 @@ fileblobCreate(void) |
| 407 | 407 |
int |
| 408 | 408 |
fileblobScanAndDestroy(fileblob *fb) |
| 409 | 409 |
{
|
| 410 |
- if(cli_leavetemps_flag) {
|
|
| 410 |
+ if(fb->ctx && fb->ctx->engine->keeptmp) {
|
|
| 411 | 411 |
/* Can't remove the file, the caller must scan */ |
| 412 | 412 |
fileblobDestroy(fb); |
| 413 | 413 |
return CL_CLEAN; |
| ... | ... |
@@ -509,7 +509,7 @@ fileblobPartialSet(fileblob *fb, const char *fullname, const char *arg) |
| 509 | 509 |
close(fb->fd); |
| 510 | 510 |
return; |
| 511 | 511 |
} |
| 512 |
- blobSetFilename(&fb->b, NULL, fullname); |
|
| 512 |
+ blobSetFilename(&fb->b, fb->ctx ? fb->ctx->engine->tmpdir : NULL, fullname); |
|
| 513 | 513 |
if(fb->b.data) |
| 514 | 514 |
if(fileblobAddData(fb, fb->b.data, fb->b.len) == 0) {
|
| 515 | 515 |
free(fb->b.data); |
| ... | ... |
@@ -122,7 +122,9 @@ enum cl_engine_field {
|
| 122 | 122 |
CL_ENGINE_DB_TIME, /* uint32_t */ |
| 123 | 123 |
CL_ENGINE_AC_ONLY, /* uint32_t */ |
| 124 | 124 |
CL_ENGINE_AC_MINDEPTH, /* uint32_t */ |
| 125 |
- CL_ENGINE_AC_MAXDEPTH /* uint32_t */ |
|
| 125 |
+ CL_ENGINE_AC_MAXDEPTH, /* uint32_t */ |
|
| 126 |
+ CL_ENGINE_TMPDIR, /* (char *) */ |
|
| 127 |
+ CL_ENGINE_KEEPTMP /* uint32_t */ |
|
| 126 | 128 |
}; |
| 127 | 129 |
|
| 128 | 130 |
extern int cl_engine_set(struct cl_engine *engine, enum cl_engine_field field, const void *val); |
| ... | ... |
@@ -184,7 +186,6 @@ extern unsigned int cl_retflevel(void); |
| 184 | 184 |
extern const char *cl_retver(void); |
| 185 | 185 |
|
| 186 | 186 |
/* others */ |
| 187 |
-extern void cl_settempdir(const char *dir, short leavetemps); |
|
| 188 | 187 |
extern const char *cl_strerror(int clerror); |
| 189 | 188 |
|
| 190 | 189 |
#ifdef __cplusplus |
| ... | ... |
@@ -3870,7 +3870,7 @@ rfc1341(message *m, const char *dir) |
| 3870 | 3870 |
|
| 3871 | 3871 |
if(!dentry_idpart || |
| 3872 | 3872 |
strcmp(filename, dentry_idpart) != 0) {
|
| 3873 |
- if(!cli_leavetemps_flag) |
|
| 3873 |
+ if(!m->ctx->engine->keeptmp) |
|
| 3874 | 3874 |
continue; |
| 3875 | 3875 |
if(stat(fullname, &statb) < 0) |
| 3876 | 3876 |
continue; |
| ... | ... |
@@ -3925,7 +3925,7 @@ rfc1341(message *m, const char *dir) |
| 3925 | 3925 |
fclose(fin); |
| 3926 | 3926 |
|
| 3927 | 3927 |
/* don't unlink if leave temps */ |
| 3928 |
- if(!cli_leavetemps_flag) {
|
|
| 3928 |
+ if(!m->ctx->engine->keeptmp) {
|
|
| 3929 | 3929 |
if(cli_unlink(fullname)) {
|
| 3930 | 3930 |
fclose(fout); |
| 3931 | 3931 |
cli_unlink(outname); |
| ... | ... |
@@ -537,7 +537,7 @@ int cli_scannulsft(int desc, cli_ctx *ctx, off_t offset) {
|
| 537 | 537 |
|
| 538 | 538 |
nsist.ifd = desc; |
| 539 | 539 |
nsist.off = offset; |
| 540 |
- if (!(nsist.dir = cli_gentemp(NULL))) |
|
| 540 |
+ if (!(nsist.dir = cli_gentemp(ctx->engine->tmpdir))) |
|
| 541 | 541 |
return CL_ETMPDIR; |
| 542 | 542 |
if(mkdir(nsist.dir, 0700)) {
|
| 543 | 543 |
cli_dbgmsg("NSIS: Can't create temporary directory %s\n", nsist.dir);
|
| ... | ... |
@@ -545,7 +545,7 @@ int cli_scannulsft(int desc, cli_ctx *ctx, off_t offset) {
|
| 545 | 545 |
return CL_ETMPDIR; |
| 546 | 546 |
} |
| 547 | 547 |
|
| 548 |
- if(cli_leavetemps_flag) cli_dbgmsg("NSIS: Extracting files to %s\n", nsist.dir);
|
|
| 548 |
+ if(ctx->engine->keeptmp) cli_dbgmsg("NSIS: Extracting files to %s\n", nsist.dir);
|
|
| 549 | 549 |
|
| 550 | 550 |
do {
|
| 551 | 551 |
ret = cli_nsis_unpack(&nsist, ctx); |
| ... | ... |
@@ -557,7 +557,7 @@ int cli_scannulsft(int desc, cli_ctx *ctx, off_t offset) {
|
| 557 | 557 |
else |
| 558 | 558 |
ret=cli_magic_scandesc(nsist.ofd, ctx); |
| 559 | 559 |
close(nsist.ofd); |
| 560 |
- if(!cli_leavetemps_flag) |
|
| 560 |
+ if(!ctx->engine->keeptmp) |
|
| 561 | 561 |
if(cli_unlink(nsist.ofn)) ret = CL_EIO; |
| 562 | 562 |
} else if(ret == CL_EMAXSIZE) {
|
| 563 | 563 |
ret = nsist.solid ? CL_BREAK : CL_SUCCESS; |
| ... | ... |
@@ -569,7 +569,7 @@ int cli_scannulsft(int desc, cli_ctx *ctx, off_t offset) {
|
| 569 | 569 |
|
| 570 | 570 |
cli_nsis_free(&nsist); |
| 571 | 571 |
|
| 572 |
- if(!cli_leavetemps_flag) |
|
| 572 |
+ if(!ctx->engine->keeptmp) |
|
| 573 | 573 |
cli_rmdirs(nsist.dir); |
| 574 | 574 |
|
| 575 | 575 |
free(nsist.dir); |
| ... | ... |
@@ -715,7 +715,7 @@ static int handler_otf(int fd, ole2_header_t *hdr, property_t *prop, const char |
| 715 | 715 |
|
| 716 | 716 |
print_ole2_property(prop); |
| 717 | 717 |
|
| 718 |
- if(!(tempfile = cli_gentemp(NULL))) |
|
| 718 |
+ if(!(tempfile = cli_gentemp(ctx ? ctx->engine->tmpdir : NULL))) |
|
| 719 | 719 |
return CL_EMEM; |
| 720 | 720 |
|
| 721 | 721 |
if((ofd = open(tempfile, O_RDWR|O_CREAT|O_TRUNC|O_BINARY, S_IRWXU)) < 0) {
|
| ... | ... |
@@ -813,7 +813,7 @@ static int handler_otf(int fd, ole2_header_t *hdr, property_t *prop, const char |
| 813 | 813 |
close(ofd); |
| 814 | 814 |
free(buff); |
| 815 | 815 |
cli_bitset_free(blk_bitset); |
| 816 |
- if(!cli_leavetemps_flag) {
|
|
| 816 |
+ if(ctx && !ctx->engine->keeptmp) {
|
|
| 817 | 817 |
if (cli_unlink(tempfile)) {
|
| 818 | 818 |
free(tempfile); |
| 819 | 819 |
return CL_EIO; |
| ... | ... |
@@ -94,7 +94,7 @@ static pthread_mutex_t cli_ctime_mutex = PTHREAD_MUTEX_INITIALIZER; |
| 94 | 94 |
|
| 95 | 95 |
#define CL_FLEVEL 37 /* don't touch it */ |
| 96 | 96 |
|
| 97 |
-uint8_t cli_debug_flag = 0, cli_leavetemps_flag = 0; |
|
| 97 |
+uint8_t cli_debug_flag = 0; |
|
| 98 | 98 |
|
| 99 | 99 |
#ifndef CLI_MEMFUNSONLY |
| 100 | 100 |
static unsigned char name_salt[16] = { 16, 38, 97, 12, 8, 4, 72, 196, 217, 144, 33, 124, 18, 11, 17, 253 };
|
| ... | ... |
@@ -337,6 +337,14 @@ int cl_engine_set(struct cl_engine *engine, enum cl_engine_field field, const vo |
| 337 | 337 |
case CL_ENGINE_AC_MAXDEPTH: |
| 338 | 338 |
engine->ac_maxdepth = *((const uint32_t *) val); |
| 339 | 339 |
break; |
| 340 |
+ case CL_ENGINE_TMPDIR: |
|
| 341 |
+ engine->tmpdir = cli_mp_strdup(engine->mempool, (const char *) val); |
|
| 342 |
+ if(!engine->tmpdir) |
|
| 343 |
+ return CL_EMEM; |
|
| 344 |
+ break; |
|
| 345 |
+ case CL_ENGINE_KEEPTMP: |
|
| 346 |
+ engine->keeptmp = *((const uint32_t *) val); |
|
| 347 |
+ break; |
|
| 340 | 348 |
default: |
| 341 | 349 |
cli_errmsg("cl_engine_set: Incorrect field number\n");
|
| 342 | 350 |
return CL_ENULLARG; /* FIXME */ |
| ... | ... |
@@ -388,6 +396,13 @@ int cl_engine_get(const struct cl_engine *engine, enum cl_engine_field field, vo |
| 388 | 388 |
case CL_ENGINE_AC_MAXDEPTH: |
| 389 | 389 |
*((uint32_t *) val) = engine->ac_maxdepth; |
| 390 | 390 |
break; |
| 391 |
+ case CL_ENGINE_TMPDIR: |
|
| 392 |
+ if(engine->tmpdir) |
|
| 393 |
+ strncpy((char *) val, engine->tmpdir, 128); |
|
| 394 |
+ break; |
|
| 395 |
+ case CL_ENGINE_KEEPTMP: |
|
| 396 |
+ *((uint32_t *) val) = engine->keeptmp; |
|
| 397 |
+ break; |
|
| 391 | 398 |
default: |
| 392 | 399 |
cli_errmsg("cl_engine_get: Incorrect field number\n");
|
| 393 | 400 |
return CL_ENULLARG; /* FIXME */ |
| ... | ... |
@@ -661,24 +676,6 @@ unsigned int cli_rndnum(unsigned int max) |
| 661 | 661 |
return 1 + (unsigned int) (max * (rand() / (1.0 + RAND_MAX))); |
| 662 | 662 |
} |
| 663 | 663 |
|
| 664 |
-void cl_settempdir(const char *dir, short leavetemps) |
|
| 665 |
-{
|
|
| 666 |
- char *var; |
|
| 667 |
- |
|
| 668 |
- if(dir) {
|
|
| 669 |
- var = (char *) cli_malloc(8 + strlen(dir)); |
|
| 670 |
- sprintf(var, "TMPDIR=%s", dir); |
|
| 671 |
- if(!putenv(var)) |
|
| 672 |
- cli_dbgmsg("Setting %s as global temporary directory\n", dir);
|
|
| 673 |
- else |
|
| 674 |
- cli_warnmsg("Can't set TMPDIR variable - insufficient space in the environment.\n");
|
|
| 675 |
- |
|
| 676 |
- /* WARNING: var must not be released - see putenv(3) */ |
|
| 677 |
- } |
|
| 678 |
- |
|
| 679 |
- cli_leavetemps_flag = leavetemps; |
|
| 680 |
-} |
|
| 681 |
- |
|
| 682 | 664 |
char *cli_gentemp(const char *dir) |
| 683 | 665 |
{
|
| 684 | 666 |
char *name, *tmp; |
| ... | ... |
@@ -35,7 +35,7 @@ |
| 35 | 35 |
#include "dconf.h" |
| 36 | 36 |
#include "libclamunrar_iface/unrar_iface.h" |
| 37 | 37 |
|
| 38 |
-extern uint8_t cli_debug_flag, cli_leavetemps_flag; |
|
| 38 |
+extern uint8_t cli_debug_flag; |
|
| 39 | 39 |
|
| 40 | 40 |
/* |
| 41 | 41 |
* CLI_ISCONTAINED(buf1, size1, buf2, size2) checks if buf2 is contained |
| ... | ... |
@@ -100,6 +100,8 @@ struct cl_engine {
|
| 100 | 100 |
uint32_t ac_only; |
| 101 | 101 |
uint32_t ac_mindepth; |
| 102 | 102 |
uint32_t ac_maxdepth; |
| 103 |
+ char *tmpdir; |
|
| 104 |
+ uint32_t keeptmp; |
|
| 103 | 105 |
|
| 104 | 106 |
/* Limits */ |
| 105 | 107 |
uint64_t maxscansize; /* during the scanning of archives this size |
| ... | ... |
@@ -544,7 +544,7 @@ cli_pdf(const char *dir, int desc, cli_ctx *ctx, off_t offset) |
| 544 | 544 |
rc = cli_magic_scandesc(fout, ctx); |
| 545 | 545 |
} |
| 546 | 546 |
close(fout); |
| 547 |
- if(!cli_leavetemps_flag) |
|
| 547 |
+ if(!ctx->engine->keeptmp) |
|
| 548 | 548 |
if (cli_unlink(fullname)) rc = CL_EIO; |
| 549 | 549 |
if(rc != CL_CLEAN) break; |
| 550 | 550 |
} |
| ... | ... |
@@ -91,7 +91,7 @@ if(cli_checklimits(NAME, ctx, (CHK), 0, 0)!=CL_CLEAN) { \
|
| 91 | 91 |
} |
| 92 | 92 |
|
| 93 | 93 |
#define CLI_UNPTEMP(NAME,FREEME) \ |
| 94 |
-if(!(tempfile = cli_gentemp(NULL))) { \
|
|
| 94 |
+if(!(tempfile = cli_gentemp(ctx->engine->tmpdir))) { \
|
|
| 95 | 95 |
cli_multifree FREEME; \ |
| 96 | 96 |
return CL_EMEM; \ |
| 97 | 97 |
} \ |
| ... | ... |
@@ -102,7 +102,7 @@ if((ndesc = open(tempfile, O_RDWR|O_CREAT|O_TRUNC|O_BINARY, S_IRWXU)) < 0) { \
|
| 102 | 102 |
return CL_EIO; \ |
| 103 | 103 |
} |
| 104 | 104 |
|
| 105 |
-#define CLI_TMPUNLK() if(!cli_leavetemps_flag) { \
|
|
| 105 |
+#define CLI_TMPUNLK() if(!ctx->engine->keeptmp) { \
|
|
| 106 | 106 |
if (cli_unlink(tempfile)) { \
|
| 107 | 107 |
free(tempfile); \ |
| 108 | 108 |
return CL_EIO; \ |
| ... | ... |
@@ -141,7 +141,7 @@ if((ndesc = open(tempfile, O_RDWR|O_CREAT|O_TRUNC|O_BINARY, S_IRWXU)) < 0) { \
|
| 141 | 141 |
#define CLI_UNPRESULTS_(NAME,FSGSTUFF,EXPR,GOOD,FREEME) \ |
| 142 | 142 |
switch(EXPR) { \
|
| 143 | 143 |
case GOOD: /* Unpacked and rebuilt */ \ |
| 144 |
- if(cli_leavetemps_flag) \ |
|
| 144 |
+ if(ctx->engine->keeptmp) \ |
|
| 145 | 145 |
cli_dbgmsg(NAME": Unpacked and rebuilt executable saved in %s\n", tempfile); \ |
| 146 | 146 |
else \ |
| 147 | 147 |
cli_dbgmsg(NAME": Unpacked and rebuilt executable\n"); \ |
| ... | ... |
@@ -1788,7 +1788,7 @@ int cli_scanpe(int desc, cli_ctx *ctx) |
| 1788 | 1788 |
free(dest); |
| 1789 | 1789 |
lseek(ndesc, 0, SEEK_SET); |
| 1790 | 1790 |
|
| 1791 |
- if(cli_leavetemps_flag) |
|
| 1791 |
+ if(ctx->engine->keeptmp) |
|
| 1792 | 1792 |
cli_dbgmsg("UPX/FSG: Decompressed data saved in %s\n", tempfile);
|
| 1793 | 1793 |
|
| 1794 | 1794 |
cli_dbgmsg("***** Scanning decompressed file *****\n");
|
| ... | ... |
@@ -1981,6 +1981,9 @@ int cl_engine_free(struct cl_engine *engine) |
| 1981 | 1981 |
if(engine->pua_cats) |
| 1982 | 1982 |
mp_free(engine->mempool, engine->pua_cats); |
| 1983 | 1983 |
|
| 1984 |
+ if(engine->tmpdir) |
|
| 1985 |
+ mp_free(engine->mempool, engine->tmpdir); |
|
| 1986 |
+ |
|
| 1984 | 1987 |
cli_ftfree(engine); |
| 1985 | 1988 |
cli_freeign(engine); |
| 1986 | 1989 |
#ifdef USE_MPOOL |
| ... | ... |
@@ -246,7 +246,7 @@ static int decode_and_scan(struct rtf_object_data* data, cli_ctx* ctx) |
| 246 | 246 |
close(data->fd); |
| 247 | 247 |
data->fd = -1; |
| 248 | 248 |
if(data->name) {
|
| 249 |
- if(!cli_leavetemps_flag) |
|
| 249 |
+ if(!ctx->engine->keeptmp) |
|
| 250 | 250 |
if(cli_unlink(data->name)) ret = CL_EIO; |
| 251 | 251 |
free(data->name); |
| 252 | 252 |
data->name = NULL; |
| ... | ... |
@@ -494,7 +494,7 @@ static void cleanup_stack(struct stack* stack,struct rtf_state* state,cli_ctx* c |
| 494 | 494 |
tableDestroy(actiontable);\ |
| 495 | 495 |
cleanup_stack(&stack,&state,ctx);\ |
| 496 | 496 |
free(buff);\ |
| 497 |
- if(!cli_leavetemps_flag)\ |
|
| 497 |
+ if(!ctx->engine->keeptmp)\ |
|
| 498 | 498 |
cli_rmdirs(tempname);\ |
| 499 | 499 |
free(tempname);\ |
| 500 | 500 |
free(stack.states); |
| ... | ... |
@@ -534,7 +534,7 @@ int cli_scanrtf(int desc, cli_ctx *ctx) |
| 534 | 534 |
return CL_EMEM; |
| 535 | 535 |
} |
| 536 | 536 |
|
| 537 |
- if(!(tempname = cli_gentemp(NULL))) |
|
| 537 |
+ if(!(tempname = cli_gentemp(ctx->engine->tmpdir))) |
|
| 538 | 538 |
return CL_EMEM; |
| 539 | 539 |
|
| 540 | 540 |
if(mkdir(tempname, 0700)) {
|
| ... | ... |
@@ -550,7 +550,7 @@ int cli_scanrtf(int desc, cli_ctx *ctx) |
| 550 | 550 |
cli_dbgmsg("RTF: Unable to load rtf action table\n");
|
| 551 | 551 |
free(stack.states); |
| 552 | 552 |
free(buff); |
| 553 |
- if(!cli_leavetemps_flag) |
|
| 553 |
+ if(!ctx->engine->keeptmp) |
|
| 554 | 554 |
cli_rmdirs(tempname); |
| 555 | 555 |
free(tempname); |
| 556 | 556 |
tableDestroy(actiontable); |
| ... | ... |
@@ -274,7 +274,7 @@ static int cli_scanrar(int desc, cli_ctx *ctx, off_t sfx_offset, uint32_t *sfx_c |
| 274 | 274 |
return CL_EIO; |
| 275 | 275 |
|
| 276 | 276 |
/* generate the temporary directory */ |
| 277 |
- if(!(dir = cli_gentemp(NULL))) |
|
| 277 |
+ if(!(dir = cli_gentemp(ctx->engine->tmpdir))) |
|
| 278 | 278 |
return CL_EMEM; |
| 279 | 279 |
|
| 280 | 280 |
if(mkdir(dir, 0700)) {
|
| ... | ... |
@@ -284,7 +284,7 @@ static int cli_scanrar(int desc, cli_ctx *ctx, off_t sfx_offset, uint32_t *sfx_c |
| 284 | 284 |
} |
| 285 | 285 |
|
| 286 | 286 |
if((ret = cli_unrar_open(desc, dir, &rar_state)) != UNRAR_OK) {
|
| 287 |
- if(!cli_leavetemps_flag) |
|
| 287 |
+ if(!ctx->engine->keeptmp) |
|
| 288 | 288 |
cli_rmdirs(dir); |
| 289 | 289 |
free(dir); |
| 290 | 290 |
if(ret == UNRAR_PASSWD) {
|
| ... | ... |
@@ -335,7 +335,7 @@ static int cli_scanrar(int desc, cli_ctx *ctx, off_t sfx_offset, uint32_t *sfx_c |
| 335 | 335 |
lseek(rar_state.ofd,0,SEEK_SET); |
| 336 | 336 |
rc = cli_magic_scandesc(rar_state.ofd,ctx); |
| 337 | 337 |
close(rar_state.ofd); |
| 338 |
- if(!cli_leavetemps_flag) |
|
| 338 |
+ if(!ctx->engine->keeptmp) |
|
| 339 | 339 |
if (cli_unlink(rar_state.filename)) ret = CL_EIO; |
| 340 | 340 |
if(rc == CL_VIRUS ) {
|
| 341 | 341 |
cli_dbgmsg("RAR: infected with %s\n",*ctx->virname);
|
| ... | ... |
@@ -359,7 +359,7 @@ static int cli_scanrar(int desc, cli_ctx *ctx, off_t sfx_offset, uint32_t *sfx_c |
| 359 | 359 |
|
| 360 | 360 |
cli_unrar_close(&rar_state); |
| 361 | 361 |
|
| 362 |
- if(!cli_leavetemps_flag) |
|
| 362 |
+ if(!ctx->engine->keeptmp) |
|
| 363 | 363 |
cli_rmdirs(dir); |
| 364 | 364 |
|
| 365 | 365 |
free(dir); |
| ... | ... |
@@ -385,7 +385,7 @@ static int cli_scanarj(int desc, cli_ctx *ctx, off_t sfx_offset, uint32_t *sfx_c |
| 385 | 385 |
cli_dbgmsg("in cli_scanarj()\n");
|
| 386 | 386 |
|
| 387 | 387 |
/* generate the temporary directory */ |
| 388 |
- if(!(dir = cli_gentemp(NULL))) |
|
| 388 |
+ if(!(dir = cli_gentemp(ctx->engine->tmpdir))) |
|
| 389 | 389 |
return CL_EMEM; |
| 390 | 390 |
|
| 391 | 391 |
if(mkdir(dir, 0700)) {
|
| ... | ... |
@@ -399,7 +399,7 @@ static int cli_scanarj(int desc, cli_ctx *ctx, off_t sfx_offset, uint32_t *sfx_c |
| 399 | 399 |
|
| 400 | 400 |
ret = cli_unarj_open(desc, dir); |
| 401 | 401 |
if (ret != CL_SUCCESS) {
|
| 402 |
- if(!cli_leavetemps_flag) |
|
| 402 |
+ if(!ctx->engine->keeptmp) |
|
| 403 | 403 |
cli_rmdirs(dir); |
| 404 | 404 |
free(dir); |
| 405 | 405 |
cli_dbgmsg("ARJ: Error: %s\n", cl_strerror(ret));
|
| ... | ... |
@@ -435,7 +435,7 @@ static int cli_scanarj(int desc, cli_ctx *ctx, off_t sfx_offset, uint32_t *sfx_c |
| 435 | 435 |
|
| 436 | 436 |
} while(ret == CL_SUCCESS); |
| 437 | 437 |
|
| 438 |
- if(!cli_leavetemps_flag) |
|
| 438 |
+ if(!ctx->engine->keeptmp) |
|
| 439 | 439 |
cli_rmdirs(dir); |
| 440 | 440 |
|
| 441 | 441 |
free(dir); |
| ... | ... |
@@ -466,7 +466,7 @@ static int cli_scangzip(int desc, cli_ctx *ctx) |
| 466 | 466 |
return CL_EGZIP; |
| 467 | 467 |
} |
| 468 | 468 |
|
| 469 |
- if((ret = cli_gentempfd(NULL, &tmpname, &fd))) {
|
|
| 469 |
+ if((ret = cli_gentempfd(ctx->engine->tmpdir, &tmpname, &fd))) {
|
|
| 470 | 470 |
cli_dbgmsg("GZip: Can't generate temporary file.\n");
|
| 471 | 471 |
gzclose(gd); |
| 472 | 472 |
return ret; |
| ... | ... |
@@ -476,7 +476,7 @@ static int cli_scangzip(int desc, cli_ctx *ctx) |
| 476 | 476 |
cli_dbgmsg("GZip: Unable to malloc %u bytes.\n", FILEBUFF);
|
| 477 | 477 |
gzclose(gd); |
| 478 | 478 |
close(fd); |
| 479 |
- if(!cli_leavetemps_flag) {
|
|
| 479 |
+ if(!ctx->engine->keeptmp) {
|
|
| 480 | 480 |
if(cli_unlink(tmpname)) {
|
| 481 | 481 |
free(tmpname); |
| 482 | 482 |
return CL_EIO; |
| ... | ... |
@@ -494,7 +494,7 @@ static int cli_scangzip(int desc, cli_ctx *ctx) |
| 494 | 494 |
if(cli_writen(fd, buff, bytes) != bytes) {
|
| 495 | 495 |
cli_dbgmsg("GZip: Can't write to file.\n");
|
| 496 | 496 |
close(fd); |
| 497 |
- if(!cli_leavetemps_flag) {
|
|
| 497 |
+ if(!ctx->engine->keeptmp) {
|
|
| 498 | 498 |
if (cli_unlink(tmpname)) {
|
| 499 | 499 |
free(tmpname); |
| 500 | 500 |
gzclose(gd); |
| ... | ... |
@@ -514,7 +514,7 @@ static int cli_scangzip(int desc, cli_ctx *ctx) |
| 514 | 514 |
|
| 515 | 515 |
if(ret == CL_VIRUS) {
|
| 516 | 516 |
close(fd); |
| 517 |
- if(!cli_leavetemps_flag) |
|
| 517 |
+ if(!ctx->engine->keeptmp) |
|
| 518 | 518 |
if (cli_unlink(tmpname)) ret = CL_EIO; |
| 519 | 519 |
free(tmpname); |
| 520 | 520 |
return ret; |
| ... | ... |
@@ -524,7 +524,7 @@ static int cli_scangzip(int desc, cli_ctx *ctx) |
| 524 | 524 |
if((ret = cli_magic_scandesc(fd, ctx)) == CL_VIRUS ) {
|
| 525 | 525 |
cli_dbgmsg("GZip: Infected with %s\n", *ctx->virname);
|
| 526 | 526 |
close(fd); |
| 527 |
- if(!cli_leavetemps_flag) {
|
|
| 527 |
+ if(!ctx->engine->keeptmp) {
|
|
| 528 | 528 |
if (cli_unlink(tmpname)) {
|
| 529 | 529 |
free(tmpname); |
| 530 | 530 |
return CL_EIO; |
| ... | ... |
@@ -534,7 +534,7 @@ static int cli_scangzip(int desc, cli_ctx *ctx) |
| 534 | 534 |
return CL_VIRUS; |
| 535 | 535 |
} |
| 536 | 536 |
close(fd); |
| 537 |
- if(!cli_leavetemps_flag) |
|
| 537 |
+ if(!ctx->engine->keeptmp) |
|
| 538 | 538 |
if (cli_unlink(tmpname)) ret = CL_EIO; |
| 539 | 539 |
free(tmpname); |
| 540 | 540 |
|
| ... | ... |
@@ -577,7 +577,7 @@ static int cli_scanbzip(int desc, cli_ctx *ctx) |
| 577 | 577 |
return CL_EBZIP; |
| 578 | 578 |
} |
| 579 | 579 |
|
| 580 |
- if((ret = cli_gentempfd(NULL, &tmpname, &fd))) {
|
|
| 580 |
+ if((ret = cli_gentempfd(ctx->engine->tmpdir, &tmpname, &fd))) {
|
|
| 581 | 581 |
cli_dbgmsg("Bzip: Can't generate temporary file.\n");
|
| 582 | 582 |
BZ2_bzReadClose(&bzerror, bfd); |
| 583 | 583 |
fclose(fs); |
| ... | ... |
@@ -587,7 +587,7 @@ static int cli_scanbzip(int desc, cli_ctx *ctx) |
| 587 | 587 |
if(!(buff = (char *) cli_malloc(FILEBUFF))) {
|
| 588 | 588 |
cli_dbgmsg("Bzip: Unable to malloc %u bytes.\n", FILEBUFF);
|
| 589 | 589 |
close(fd); |
| 590 |
- if(!cli_leavetemps_flag) {
|
|
| 590 |
+ if(!ctx->engine->keeptmp) {
|
|
| 591 | 591 |
if (cli_unlink(tmpname)) {
|
| 592 | 592 |
free(tmpname); |
| 593 | 593 |
fclose(fs); |
| ... | ... |
@@ -611,7 +611,7 @@ static int cli_scanbzip(int desc, cli_ctx *ctx) |
| 611 | 611 |
cli_dbgmsg("Bzip: Can't write to file.\n");
|
| 612 | 612 |
BZ2_bzReadClose(&bzerror, bfd); |
| 613 | 613 |
close(fd); |
| 614 |
- if(!cli_leavetemps_flag) {
|
|
| 614 |
+ if(!ctx->engine->keeptmp) {
|
|
| 615 | 615 |
if (cli_unlink(tmpname)) {
|
| 616 | 616 |
free(tmpname); |
| 617 | 617 |
free(buff); |
| ... | ... |
@@ -631,7 +631,7 @@ static int cli_scanbzip(int desc, cli_ctx *ctx) |
| 631 | 631 |
|
| 632 | 632 |
if(ret == CL_VIRUS) {
|
| 633 | 633 |
close(fd); |
| 634 |
- if(!cli_leavetemps_flag) |
|
| 634 |
+ if(!ctx->engine->keeptmp) |
|
| 635 | 635 |
if (cli_unlink(tmpname)) ret = CL_EIO; |
| 636 | 636 |
free(tmpname); |
| 637 | 637 |
fclose(fs); |
| ... | ... |
@@ -643,7 +643,7 @@ static int cli_scanbzip(int desc, cli_ctx *ctx) |
| 643 | 643 |
cli_dbgmsg("Bzip: Infected with %s\n", *ctx->virname);
|
| 644 | 644 |
} |
| 645 | 645 |
close(fd); |
| 646 |
- if(!cli_leavetemps_flag) |
|
| 646 |
+ if(!ctx->engine->keeptmp) |
|
| 647 | 647 |
if (cli_unlink(tmpname)) ret = CL_EIO; |
| 648 | 648 |
free(tmpname); |
| 649 | 649 |
fclose(fs); |
| ... | ... |
@@ -660,7 +660,7 @@ static int cli_scanszdd(int desc, cli_ctx *ctx) |
| 660 | 660 |
|
| 661 | 661 |
cli_dbgmsg("in cli_scanszdd()\n");
|
| 662 | 662 |
|
| 663 |
- if((ret = cli_gentempfd(NULL, &tmpname, &ofd))) {
|
|
| 663 |
+ if((ret = cli_gentempfd(ctx->engine->tmpdir, &tmpname, &ofd))) {
|
|
| 664 | 664 |
cli_dbgmsg("MSEXPAND: Can't generate temporary file/descriptor\n");
|
| 665 | 665 |
return ret; |
| 666 | 666 |
} |
| ... | ... |
@@ -670,7 +670,7 @@ static int cli_scanszdd(int desc, cli_ctx *ctx) |
| 670 | 670 |
|
| 671 | 671 |
if(ret != CL_SUCCESS) { /* CL_VIRUS or some error */
|
| 672 | 672 |
close(ofd); |
| 673 |
- if(!cli_leavetemps_flag) |
|
| 673 |
+ if(!ctx->engine->keeptmp) |
|
| 674 | 674 |
if (cli_unlink(tmpname)) ret = CL_EIO; |
| 675 | 675 |
free(tmpname); |
| 676 | 676 |
return ret; |
| ... | ... |
@@ -680,7 +680,7 @@ static int cli_scanszdd(int desc, cli_ctx *ctx) |
| 680 | 680 |
lseek(ofd, 0, SEEK_SET); |
| 681 | 681 |
ret = cli_magic_scandesc(ofd, ctx); |
| 682 | 682 |
close(ofd); |
| 683 |
- if(!cli_leavetemps_flag) |
|
| 683 |
+ if(!ctx->engine->keeptmp) |
|
| 684 | 684 |
if (cli_unlink(tmpname)) ret = CL_EIO; |
| 685 | 685 |
free(tmpname); |
| 686 | 686 |
|
| ... | ... |
@@ -707,7 +707,7 @@ static int cli_scanmscab(int desc, cli_ctx *ctx, off_t sfx_offset) |
| 707 | 707 |
if(cli_checklimits("CAB", ctx, file->length, 0, 0)!=CL_CLEAN)
|
| 708 | 708 |
continue; |
| 709 | 709 |
|
| 710 |
- if(!(tempname = cli_gentemp(NULL))) {
|
|
| 710 |
+ if(!(tempname = cli_gentemp(ctx->engine->tmpdir))) {
|
|
| 711 | 711 |
ret = CL_EMEM; |
| 712 | 712 |
break; |
| 713 | 713 |
} |
| ... | ... |
@@ -717,7 +717,7 @@ static int cli_scanmscab(int desc, cli_ctx *ctx, off_t sfx_offset) |
| 717 | 717 |
else |
| 718 | 718 |
ret = cli_scanfile(tempname, ctx); |
| 719 | 719 |
|
| 720 |
- if(!cli_leavetemps_flag) {
|
|
| 720 |
+ if(!ctx->engine->keeptmp) {
|
|
| 721 | 721 |
if (cli_unlink(tempname)) {
|
| 722 | 722 |
free(tempname); |
| 723 | 723 |
ret = CL_EIO; |
| ... | ... |
@@ -797,11 +797,11 @@ static int cli_vba_scandir(const char *dirname, cli_ctx *ctx, struct uniq *U) |
| 797 | 797 |
vbaname[sizeof(vbaname)-1] = '\0'; |
| 798 | 798 |
fd = open(vbaname, O_RDONLY|O_BINARY); |
| 799 | 799 |
if (fd == -1) continue; |
| 800 |
- if ((fullname = cli_ppt_vba_read(fd))) {
|
|
| 800 |
+ if ((fullname = cli_ppt_vba_read(fd, ctx))) {
|
|
| 801 | 801 |
if(cli_scandir(fullname, ctx, 0) == CL_VIRUS) {
|
| 802 | 802 |
ret = CL_VIRUS; |
| 803 | 803 |
} |
| 804 |
- if(!cli_leavetemps_flag) |
|
| 804 |
+ if(!ctx->engine->keeptmp) |
|
| 805 | 805 |
cli_rmdirs(fullname); |
| 806 | 806 |
free(fullname); |
| 807 | 807 |
} |
| ... | ... |
@@ -940,7 +940,7 @@ static int cli_scanhtml(int desc, cli_ctx *ctx) |
| 940 | 940 |
return CL_CLEAN; |
| 941 | 941 |
} |
| 942 | 942 |
|
| 943 |
- if(!(tempname = cli_gentemp(NULL))) |
|
| 943 |
+ if(!(tempname = cli_gentemp(ctx->engine->tmpdir))) |
|
| 944 | 944 |
return CL_EMEM; |
| 945 | 945 |
|
| 946 | 946 |
if(mkdir(tempname, 0700)) {
|
| ... | ... |
@@ -988,7 +988,7 @@ static int cli_scanhtml(int desc, cli_ctx *ctx) |
| 988 | 988 |
ret = cli_scandir(fullname, ctx, 0); |
| 989 | 989 |
} |
| 990 | 990 |
|
| 991 |
- if(!cli_leavetemps_flag) |
|
| 991 |
+ if(!ctx->engine->keeptmp) |
|
| 992 | 992 |
cli_rmdirs(tempname); |
| 993 | 993 |
|
| 994 | 994 |
free(tempname); |
| ... | ... |
@@ -1022,8 +1022,8 @@ static int cli_scanscript(int desc, cli_ctx *ctx) |
| 1022 | 1022 |
|
| 1023 | 1023 |
/* dump to disk only if explicitly asked to, |
| 1024 | 1024 |
* otherwise we can process just in-memory */ |
| 1025 |
- if(cli_leavetemps_flag) {
|
|
| 1026 |
- if((ret = cli_gentempfd(NULL, &tmpname, &ofd))) {
|
|
| 1025 |
+ if(ctx->engine->keeptmp) {
|
|
| 1026 |
+ if((ret = cli_gentempfd(ctx->engine->tmpdir, &tmpname, &ofd))) {
|
|
| 1027 | 1027 |
cli_dbgmsg("cli_scanscript: Can't generate temporary file/descriptor\n");
|
| 1028 | 1028 |
return ret; |
| 1029 | 1029 |
} |
| ... | ... |
@@ -1065,7 +1065,7 @@ static int cli_scanscript(int desc, cli_ctx *ctx) |
| 1065 | 1065 |
* and using while(){} loop would mean code duplication */
|
| 1066 | 1066 |
} while (nread > 0); |
| 1067 | 1067 |
|
| 1068 |
- if(cli_leavetemps_flag) {
|
|
| 1068 |
+ if(ctx->engine->keeptmp) {
|
|
| 1069 | 1069 |
free(tmpname); |
| 1070 | 1070 |
close(ofd); |
| 1071 | 1071 |
} |
| ... | ... |
@@ -1082,7 +1082,7 @@ static int cli_scanhtml_utf16(int desc, cli_ctx *ctx) |
| 1082 | 1082 |
|
| 1083 | 1083 |
cli_dbgmsg("in cli_scanhtml_utf16()\n");
|
| 1084 | 1084 |
|
| 1085 |
- if(!(tempname = cli_gentemp(NULL))) |
|
| 1085 |
+ if(!(tempname = cli_gentemp(ctx->engine->tmpdir))) |
|
| 1086 | 1086 |
return CL_EMEM; |
| 1087 | 1087 |
|
| 1088 | 1088 |
if((fd = open(tempname, O_RDWR|O_CREAT|O_TRUNC|O_BINARY, S_IRWXU)) < 0) {
|
| ... | ... |
@@ -1112,7 +1112,7 @@ static int cli_scanhtml_utf16(int desc, cli_ctx *ctx) |
| 1112 | 1112 |
ret = cli_scanhtml(fd, ctx); |
| 1113 | 1113 |
close(fd); |
| 1114 | 1114 |
|
| 1115 |
- if(!cli_leavetemps_flag) {
|
|
| 1115 |
+ if(!ctx->engine->keeptmp) {
|
|
| 1116 | 1116 |
if (cli_unlink(tempname)) ret = CL_EIO; |
| 1117 | 1117 |
} else |
| 1118 | 1118 |
cli_dbgmsg("cli_scanhtml_utf16: Decoded HTML data saved in %s\n", tempname);
|
| ... | ... |
@@ -1133,7 +1133,7 @@ static int cli_scanole2(int desc, cli_ctx *ctx) |
| 1133 | 1133 |
return CL_EMAXREC; |
| 1134 | 1134 |
|
| 1135 | 1135 |
/* generate the temporary directory */ |
| 1136 |
- if(!(dir = cli_gentemp(NULL))) |
|
| 1136 |
+ if(!(dir = cli_gentemp(ctx->engine->tmpdir))) |
|
| 1137 | 1137 |
return CL_EMEM; |
| 1138 | 1138 |
|
| 1139 | 1139 |
if(mkdir(dir, 0700)) {
|
| ... | ... |
@@ -1145,7 +1145,7 @@ static int cli_scanole2(int desc, cli_ctx *ctx) |
| 1145 | 1145 |
ret = cli_ole2_extract(desc, dir, ctx, &vba); |
| 1146 | 1146 |
if(ret!=CL_CLEAN && ret!=CL_VIRUS) {
|
| 1147 | 1147 |
cli_dbgmsg("OLE2: %s\n", cl_strerror(ret));
|
| 1148 |
- if(!cli_leavetemps_flag) |
|
| 1148 |
+ if(!ctx->engine->keeptmp) |
|
| 1149 | 1149 |
cli_rmdirs(dir); |
| 1150 | 1150 |
free(dir); |
| 1151 | 1151 |
return ret; |
| ... | ... |
@@ -1162,7 +1162,7 @@ static int cli_scanole2(int desc, cli_ctx *ctx) |
| 1162 | 1162 |
ctx->recursion--; |
| 1163 | 1163 |
} |
| 1164 | 1164 |
|
| 1165 |
- if(!cli_leavetemps_flag) |
|
| 1165 |
+ if(!ctx->engine->keeptmp) |
|
| 1166 | 1166 |
cli_rmdirs(dir); |
| 1167 | 1167 |
free(dir); |
| 1168 | 1168 |
return ret; |
| ... | ... |
@@ -1177,7 +1177,7 @@ static int cli_scantar(int desc, cli_ctx *ctx, unsigned int posix) |
| 1177 | 1177 |
cli_dbgmsg("in cli_scantar()\n");
|
| 1178 | 1178 |
|
| 1179 | 1179 |
/* generate temporary directory */ |
| 1180 |
- if(!(dir = cli_gentemp(NULL))) |
|
| 1180 |
+ if(!(dir = cli_gentemp(ctx->engine->tmpdir))) |
|
| 1181 | 1181 |
return CL_EMEM; |
| 1182 | 1182 |
|
| 1183 | 1183 |
if(mkdir(dir, 0700)) {
|
| ... | ... |
@@ -1188,7 +1188,7 @@ static int cli_scantar(int desc, cli_ctx *ctx, unsigned int posix) |
| 1188 | 1188 |
|
| 1189 | 1189 |
ret = cli_untar(dir, desc, posix, ctx); |
| 1190 | 1190 |
|
| 1191 |
- if(!cli_leavetemps_flag) |
|
| 1191 |
+ if(!ctx->engine->keeptmp) |
|
| 1192 | 1192 |
cli_rmdirs(dir); |
| 1193 | 1193 |
|
| 1194 | 1194 |
free(dir); |
| ... | ... |
@@ -1204,7 +1204,7 @@ static int cli_scanbinhex(int desc, cli_ctx *ctx) |
| 1204 | 1204 |
cli_dbgmsg("in cli_scanbinhex()\n");
|
| 1205 | 1205 |
|
| 1206 | 1206 |
/* generate temporary directory */ |
| 1207 |
- if(!(dir = cli_gentemp(NULL))) |
|
| 1207 |
+ if(!(dir = cli_gentemp(ctx->engine->tmpdir))) |
|
| 1208 | 1208 |
return CL_EMEM; |
| 1209 | 1209 |
|
| 1210 | 1210 |
if(mkdir(dir, 0700)) {
|
| ... | ... |
@@ -1218,7 +1218,7 @@ static int cli_scanbinhex(int desc, cli_ctx *ctx) |
| 1218 | 1218 |
else |
| 1219 | 1219 |
ret = cli_scandir(dir, ctx, 0); |
| 1220 | 1220 |
|
| 1221 |
- if(!cli_leavetemps_flag) |
|
| 1221 |
+ if(!ctx->engine->keeptmp) |
|
| 1222 | 1222 |
cli_rmdirs(dir); |
| 1223 | 1223 |
|
| 1224 | 1224 |
free(dir); |
| ... | ... |
@@ -1234,7 +1234,7 @@ static int cli_scanmschm(int desc, cli_ctx *ctx) |
| 1234 | 1234 |
cli_dbgmsg("in cli_scanmschm()\n");
|
| 1235 | 1235 |
|
| 1236 | 1236 |
/* generate the temporary directory */ |
| 1237 |
- if(!(dir = cli_gentemp(NULL))) |
|
| 1237 |
+ if(!(dir = cli_gentemp(ctx->engine->tmpdir))) |
|
| 1238 | 1238 |
return CL_EMEM; |
| 1239 | 1239 |
|
| 1240 | 1240 |
if(mkdir(dir, 0700)) {
|
| ... | ... |
@@ -1245,7 +1245,7 @@ static int cli_scanmschm(int desc, cli_ctx *ctx) |
| 1245 | 1245 |
|
| 1246 | 1246 |
ret = cli_chm_open(desc, dir, &metadata); |
| 1247 | 1247 |
if (ret != CL_SUCCESS) {
|
| 1248 |
- if(!cli_leavetemps_flag) |
|
| 1248 |
+ if(!ctx->engine->keeptmp) |
|
| 1249 | 1249 |
cli_rmdirs(dir); |
| 1250 | 1250 |
free(dir); |
| 1251 | 1251 |
cli_dbgmsg("CHM: Error: %s\n", cl_strerror(ret));
|
| ... | ... |
@@ -1273,7 +1273,7 @@ static int cli_scanmschm(int desc, cli_ctx *ctx) |
| 1273 | 1273 |
|
| 1274 | 1274 |
cli_chm_close(&metadata); |
| 1275 | 1275 |
|
| 1276 |
- if(!cli_leavetemps_flag) |
|
| 1276 |
+ if(!ctx->engine->keeptmp) |
|
| 1277 | 1277 |
cli_rmdirs(dir); |
| 1278 | 1278 |
|
| 1279 | 1279 |
free(dir); |
| ... | ... |
@@ -1292,7 +1292,7 @@ static int cli_scanscrenc(int desc, cli_ctx *ctx) |
| 1292 | 1292 |
|
| 1293 | 1293 |
cli_dbgmsg("in cli_scanscrenc()\n");
|
| 1294 | 1294 |
|
| 1295 |
- if(!(tempname = cli_gentemp(NULL))) |
|
| 1295 |
+ if(!(tempname = cli_gentemp(ctx->engine->tmpdir))) |
|
| 1296 | 1296 |
return CL_EMEM; |
| 1297 | 1297 |
|
| 1298 | 1298 |
if(mkdir(tempname, 0700)) {
|
| ... | ... |
@@ -1304,7 +1304,7 @@ static int cli_scanscrenc(int desc, cli_ctx *ctx) |
| 1304 | 1304 |
if (html_screnc_decode(desc, tempname)) |
| 1305 | 1305 |
ret = cli_scandir(tempname, ctx, 0); |
| 1306 | 1306 |
|
| 1307 |
- if(!cli_leavetemps_flag) |
|
| 1307 |
+ if(!ctx->engine->keeptmp) |
|
| 1308 | 1308 |
cli_rmdirs(tempname); |
| 1309 | 1309 |
|
| 1310 | 1310 |
free(tempname); |
| ... | ... |
@@ -1380,7 +1380,7 @@ static int cli_scancryptff(int desc, cli_ctx *ctx) |
| 1380 | 1380 |
|
| 1381 | 1381 |
free(src); |
| 1382 | 1382 |
|
| 1383 |
- if(!(tempfile = cli_gentemp(NULL))) {
|
|
| 1383 |
+ if(!(tempfile = cli_gentemp(ctx->engine->tmpdir))) {
|
|
| 1384 | 1384 |
free(dest); |
| 1385 | 1385 |
return CL_EMEM; |
| 1386 | 1386 |
} |
| ... | ... |
@@ -1411,7 +1411,7 @@ static int cli_scancryptff(int desc, cli_ctx *ctx) |
| 1411 | 1411 |
|
| 1412 | 1412 |
close(ndesc); |
| 1413 | 1413 |
|
| 1414 |
- if(cli_leavetemps_flag) |
|
| 1414 |
+ if(ctx->engine->keeptmp) |
|
| 1415 | 1415 |
cli_dbgmsg("CryptFF: Decompressed data saved in %s\n", tempfile);
|
| 1416 | 1416 |
else |
| 1417 | 1417 |
if (cli_unlink(tempfile)) ret = CL_EIO; |
| ... | ... |
@@ -1423,7 +1423,7 @@ static int cli_scancryptff(int desc, cli_ctx *ctx) |
| 1423 | 1423 |
static int cli_scanpdf(int desc, cli_ctx *ctx, off_t offset) |
| 1424 | 1424 |
{
|
| 1425 | 1425 |
int ret; |
| 1426 |
- char *dir = cli_gentemp(NULL); |
|
| 1426 |
+ char *dir = cli_gentemp(ctx->engine->tmpdir); |
|
| 1427 | 1427 |
|
| 1428 | 1428 |
if(!dir) |
| 1429 | 1429 |
return CL_EMEM; |
| ... | ... |
@@ -1436,7 +1436,7 @@ static int cli_scanpdf(int desc, cli_ctx *ctx, off_t offset) |
| 1436 | 1436 |
|
| 1437 | 1437 |
ret = cli_pdf(dir, desc, ctx, offset); |
| 1438 | 1438 |
|
| 1439 |
- if(!cli_leavetemps_flag) |
|
| 1439 |
+ if(!ctx->engine->keeptmp) |
|
| 1440 | 1440 |
cli_rmdirs(dir); |
| 1441 | 1441 |
|
| 1442 | 1442 |
free(dir); |
| ... | ... |
@@ -1446,7 +1446,7 @@ static int cli_scanpdf(int desc, cli_ctx *ctx, off_t offset) |
| 1446 | 1446 |
static int cli_scantnef(int desc, cli_ctx *ctx) |
| 1447 | 1447 |
{
|
| 1448 | 1448 |
int ret; |
| 1449 |
- char *dir = cli_gentemp(NULL); |
|
| 1449 |
+ char *dir = cli_gentemp(ctx->engine->tmpdir); |
|
| 1450 | 1450 |
|
| 1451 | 1451 |
if(!dir) |
| 1452 | 1452 |
return CL_EMEM; |
| ... | ... |
@@ -1457,12 +1457,12 @@ static int cli_scantnef(int desc, cli_ctx *ctx) |
| 1457 | 1457 |
return CL_ETMPDIR; |
| 1458 | 1458 |
} |
| 1459 | 1459 |
|
| 1460 |
- ret = cli_tnef(dir, desc); |
|
| 1460 |
+ ret = cli_tnef(dir, desc, ctx); |
|
| 1461 | 1461 |
|
| 1462 | 1462 |
if(ret == CL_CLEAN) |
| 1463 | 1463 |
ret = cli_scandir(dir, ctx, 0); |
| 1464 | 1464 |
|
| 1465 |
- if(!cli_leavetemps_flag) |
|
| 1465 |
+ if(!ctx->engine->keeptmp) |
|
| 1466 | 1466 |
cli_rmdirs(dir); |
| 1467 | 1467 |
|
| 1468 | 1468 |
free(dir); |
| ... | ... |
@@ -1472,7 +1472,7 @@ static int cli_scantnef(int desc, cli_ctx *ctx) |
| 1472 | 1472 |
static int cli_scanuuencoded(int desc, cli_ctx *ctx) |
| 1473 | 1473 |
{
|
| 1474 | 1474 |
int ret; |
| 1475 |
- char *dir = cli_gentemp(NULL); |
|
| 1475 |
+ char *dir = cli_gentemp(ctx->engine->tmpdir); |
|
| 1476 | 1476 |
|
| 1477 | 1477 |
if(!dir) |
| 1478 | 1478 |
return CL_EMEM; |
| ... | ... |
@@ -1488,7 +1488,7 @@ static int cli_scanuuencoded(int desc, cli_ctx *ctx) |
| 1488 | 1488 |
if(ret == CL_CLEAN) |
| 1489 | 1489 |
ret = cli_scandir(dir, ctx, 0); |
| 1490 | 1490 |
|
| 1491 |
- if(!cli_leavetemps_flag) |
|
| 1491 |
+ if(!ctx->engine->keeptmp) |
|
| 1492 | 1492 |
cli_rmdirs(dir); |
| 1493 | 1493 |
|
| 1494 | 1494 |
free(dir); |
| ... | ... |
@@ -1504,7 +1504,7 @@ static int cli_scanmail(int desc, cli_ctx *ctx) |
| 1504 | 1504 |
cli_dbgmsg("Starting cli_scanmail(), recursion = %u\n", ctx->recursion);
|
| 1505 | 1505 |
|
| 1506 | 1506 |
/* generate the temporary directory */ |
| 1507 |
- if(!(dir = cli_gentemp(NULL))) |
|
| 1507 |
+ if(!(dir = cli_gentemp(ctx->engine->tmpdir))) |
|
| 1508 | 1508 |
return CL_EMEM; |
| 1509 | 1509 |
|
| 1510 | 1510 |
if(mkdir(dir, 0700)) {
|
| ... | ... |
@@ -1517,7 +1517,7 @@ static int cli_scanmail(int desc, cli_ctx *ctx) |
| 1517 | 1517 |
* Extract the attachments into the temporary directory |
| 1518 | 1518 |
*/ |
| 1519 | 1519 |
if((ret = cli_mbox(dir, desc, ctx))) {
|
| 1520 |
- if(!cli_leavetemps_flag) |
|
| 1520 |
+ if(!ctx->engine->keeptmp) |
|
| 1521 | 1521 |
cli_rmdirs(dir); |
| 1522 | 1522 |
free(dir); |
| 1523 | 1523 |
return ret; |
| ... | ... |
@@ -1525,7 +1525,7 @@ static int cli_scanmail(int desc, cli_ctx *ctx) |
| 1525 | 1525 |
|
| 1526 | 1526 |
ret = cli_scandir(dir, ctx, CL_TYPE_MAIL); |
| 1527 | 1527 |
|
| 1528 |
- if(!cli_leavetemps_flag) |
|
| 1528 |
+ if(!ctx->engine->keeptmp) |
|
| 1529 | 1529 |
cli_rmdirs(dir); |
| 1530 | 1530 |
|
| 1531 | 1531 |
free(dir); |
| ... | ... |
@@ -1609,7 +1609,7 @@ static int cli_scanembpe(int desc, cli_ctx *ctx) |
| 1609 | 1609 |
char *tmpname; |
| 1610 | 1610 |
|
| 1611 | 1611 |
|
| 1612 |
- tmpname = cli_gentemp(NULL); |
|
| 1612 |
+ tmpname = cli_gentemp(ctx->engine->tmpdir); |
|
| 1613 | 1613 |
if(!tmpname) |
| 1614 | 1614 |
return CL_EMEM; |
| 1615 | 1615 |
|
| ... | ... |
@@ -1628,7 +1628,7 @@ static int cli_scanembpe(int desc, cli_ctx *ctx) |
| 1628 | 1628 |
if(cli_writen(fd, buff, bytes) != bytes) {
|
| 1629 | 1629 |
cli_dbgmsg("cli_scanembpe: Can't write to temporary file\n");
|
| 1630 | 1630 |
close(fd); |
| 1631 |
- if(!cli_leavetemps_flag) {
|
|
| 1631 |
+ if(!ctx->engine->keeptmp) {
|
|
| 1632 | 1632 |
if (cli_unlink(tmpname)) {
|
| 1633 | 1633 |
free(tmpname); |
| 1634 | 1634 |
return CL_EIO; |
| ... | ... |
@@ -1644,7 +1644,7 @@ static int cli_scanembpe(int desc, cli_ctx *ctx) |
| 1644 | 1644 |
if((ret = cli_magic_scandesc(fd, ctx)) == CL_VIRUS) {
|
| 1645 | 1645 |
cli_dbgmsg("cli_scanembpe: Infected with %s\n", *ctx->virname);
|
| 1646 | 1646 |
close(fd); |
| 1647 |
- if(!cli_leavetemps_flag) {
|
|
| 1647 |
+ if(!ctx->engine->keeptmp) {
|
|
| 1648 | 1648 |
if (cli_unlink(tmpname)) {
|
| 1649 | 1649 |
free(tmpname); |
| 1650 | 1650 |
return CL_EIO; |
| ... | ... |
@@ -1656,7 +1656,7 @@ static int cli_scanembpe(int desc, cli_ctx *ctx) |
| 1656 | 1656 |
ctx->recursion--; |
| 1657 | 1657 |
|
| 1658 | 1658 |
close(fd); |
| 1659 |
- if(!cli_leavetemps_flag) {
|
|
| 1659 |
+ if(!ctx->engine->keeptmp) {
|
|
| 1660 | 1660 |
if (cli_unlink(tmpname)) {
|
| 1661 | 1661 |
free(tmpname); |
| 1662 | 1662 |
return CL_EIO; |
| ... | ... |
@@ -67,14 +67,14 @@ int cli_scansis(int desc, cli_ctx *ctx) {
|
| 67 | 67 |
|
| 68 | 68 |
cli_dbgmsg("in scansis()\n");
|
| 69 | 69 |
|
| 70 |
- if (!(tmpd = cli_gentemp(NULL))) |
|
| 70 |
+ if (!(tmpd = cli_gentemp(ctx->engine->tmpdir))) |
|
| 71 | 71 |
return CL_ETMPDIR; |
| 72 | 72 |
if (mkdir(tmpd, 0700)) {
|
| 73 | 73 |
cli_dbgmsg("SIS: Can't create temporary directory %s\n", tmpd);
|
| 74 | 74 |
free(tmpd); |
| 75 | 75 |
return CL_ETMPDIR; |
| 76 | 76 |
} |
| 77 |
- if (cli_leavetemps_flag) |
|
| 77 |
+ if (ctx->engine->keeptmp) |
|
| 78 | 78 |
cli_dbgmsg("SIS: Extracting files to %s\n", tmpd);
|
| 79 | 79 |
|
| 80 | 80 |
if ((i=dup(desc))==-1) {
|
| ... | ... |
@@ -106,7 +106,7 @@ int cli_scansis(int desc, cli_ctx *ctx) {
|
| 106 | 106 |
i=real_scansis9x(f, ctx, tmpd); |
| 107 | 107 |
} |
| 108 | 108 |
|
| 109 |
- if (!cli_leavetemps_flag) |
|
| 109 |
+ if (!ctx->engine->keeptmp) |
|
| 110 | 110 |
cli_rmdirs(tmpd); |
| 111 | 111 |
|
| 112 | 112 |
free(tmpd); |
| ... | ... |
@@ -61,7 +61,7 @@ static int tnef_header(FILE *fp, uint8_t *part, uint16_t *type, uint16_t *tag, i |
| 61 | 61 |
#define MIN_SIZE (sizeof(uint32_t) + sizeof(uint16_t)) |
| 62 | 62 |
|
| 63 | 63 |
int |
| 64 |
-cli_tnef(const char *dir, int desc) |
|
| 64 |
+cli_tnef(const char *dir, int desc, cli_ctx *ctx) |
|
| 65 | 65 |
{
|
| 66 | 66 |
uint32_t i32; |
| 67 | 67 |
uint16_t i16; |
| ... | ... |
@@ -179,7 +179,7 @@ cli_tnef(const char *dir, int desc) |
| 179 | 179 |
*/ |
| 180 | 180 |
if(cli_debug_flag) {
|
| 181 | 181 |
int fout = -1; |
| 182 |
- char *filename = cli_gentemp(NULL); |
|
| 182 |
+ char *filename = cli_gentemp(ctx->engine->tmpdir); |
|
| 183 | 183 |
char buffer[BUFSIZ]; |
| 184 | 184 |
|
| 185 | 185 |
if(filename) |
| ... | ... |
@@ -92,7 +92,7 @@ cli_untar(const char *dir, int desc, unsigned int posix, cli_ctx *ctx) |
| 92 | 92 |
lseek(fout, 0, SEEK_SET); |
| 93 | 93 |
ret = cli_magic_scandesc(fout, ctx); |
| 94 | 94 |
close(fout); |
| 95 |
- if (!cli_leavetemps_flag) |
|
| 95 |
+ if (!ctx->engine->keeptmp) |
|
| 96 | 96 |
if (cli_unlink(fullname)) return CL_EIO; |
| 97 | 97 |
if (ret==CL_VIRUS) |
| 98 | 98 |
return CL_VIRUS; |
| ... | ... |
@@ -211,7 +211,7 @@ cli_untar(const char *dir, int desc, unsigned int posix, cli_ctx *ctx) |
| 211 | 211 |
lseek(fout, 0, SEEK_SET); |
| 212 | 212 |
ret = cli_magic_scandesc(fout, ctx); |
| 213 | 213 |
close(fout); |
| 214 |
- if (!cli_leavetemps_flag) |
|
| 214 |
+ if (!ctx->engine->keeptmp) |
|
| 215 | 215 |
if (cli_unlink(fullname)) return CL_EIO; |
| 216 | 216 |
if (ret==CL_VIRUS) |
| 217 | 217 |
return CL_VIRUS; |
| ... | ... |
@@ -86,7 +86,7 @@ static int unz(uint8_t *src, uint32_t csize, uint32_t usize, uint16_t method, ui |
| 86 | 86 |
snprintf(name, sizeof(name), "%s/zip.%03u", tmpd, *fu); |
| 87 | 87 |
name[sizeof(name)-1]='\0'; |
| 88 | 88 |
} else {
|
| 89 |
- if(!(tempfile = cli_gentemp(NULL))) return CL_EMEM; |
|
| 89 |
+ if(!(tempfile = cli_gentemp(ctx->engine->tmpdir))) return CL_EMEM; |
|
| 90 | 90 |
} |
| 91 | 91 |
if((of = open(tempfile, O_RDWR|O_CREAT|O_TRUNC|O_BINARY, S_IRUSR|S_IWUSR))==-1) {
|
| 92 | 92 |
cli_warnmsg("cli_unzip: failed to create temporary file %s\n", tempfile);
|
| ... | ... |
@@ -303,14 +303,14 @@ static int unz(uint8_t *src, uint32_t csize, uint32_t usize, uint16_t method, ui |
| 303 | 303 |
lseek(of, 0, SEEK_SET); |
| 304 | 304 |
ret = cli_magic_scandesc(of, ctx); |
| 305 | 305 |
close(of); |
| 306 |
- if(!cli_leavetemps_flag) |
|
| 306 |
+ if(!ctx->engine->keeptmp) |
|
| 307 | 307 |
if(cli_unlink(tempfile)) ret = CL_EIO; |
| 308 | 308 |
if(!tmpd) free(tempfile); |
| 309 | 309 |
return ret; |
| 310 | 310 |
} |
| 311 | 311 |
|
| 312 | 312 |
close(of); |
| 313 |
- if(!cli_leavetemps_flag) |
|
| 313 |
+ if(!ctx->engine->keeptmp) |
|
| 314 | 314 |
if(cli_unlink(tempfile)) ret = CL_EIO; |
| 315 | 315 |
if(!tmpd) free(tempfile); |
| 316 | 316 |
cli_dbgmsg("cli_unzip: extraction failed\n");
|
| ... | ... |
@@ -513,7 +513,7 @@ int cli_unzip(int f, cli_ctx *ctx) {
|
| 513 | 513 |
} |
| 514 | 514 |
#endif |
| 515 | 515 |
|
| 516 |
- if (!(tmpd = cli_gentemp(NULL))) {
|
|
| 516 |
+ if (!(tmpd = cli_gentemp(ctx->engine->tmpdir))) {
|
|
| 517 | 517 |
destroy_map(map, fsize); |
| 518 | 518 |
return CL_ETMPDIR; |
| 519 | 519 |
} |
| ... | ... |
@@ -556,7 +556,7 @@ int cli_unzip(int f, cli_ctx *ctx) {
|
| 556 | 556 |
} |
| 557 | 557 |
|
| 558 | 558 |
destroy_map(map, fsize); |
| 559 |
- if (!cli_leavetemps_flag) cli_rmdirs(tmpd); |
|
| 559 |
+ if (!ctx->engine->keeptmp) cli_rmdirs(tmpd); |
|
| 560 | 560 |
free(tmpd); |
| 561 | 561 |
|
| 562 | 562 |
return ret; |
| ... | ... |
@@ -588,7 +588,7 @@ cli_scan_ole10(int fd, cli_ctx *ctx) |
| 588 | 588 |
if(!read_uint32(fd, &object_size, FALSE)) |
| 589 | 589 |
return CL_CLEAN; |
| 590 | 590 |
} |
| 591 |
- if(!(fullname = cli_gentemp(NULL))) {
|
|
| 591 |
+ if(!(fullname = cli_gentemp(ctx ? ctx->engine->tmpdir : NULL))) {
|
|
| 592 | 592 |
return CL_EMEM; |
| 593 | 593 |
} |
| 594 | 594 |
ofd = open(fullname, O_RDWR|O_CREAT|O_TRUNC|O_BINARY|O_EXCL, |
| ... | ... |
@@ -603,7 +603,7 @@ cli_scan_ole10(int fd, cli_ctx *ctx) |
| 603 | 603 |
lseek(ofd, 0, SEEK_SET); |
| 604 | 604 |
ret = cli_magic_scandesc(ofd, ctx); |
| 605 | 605 |
close(ofd); |
| 606 |
- if(!cli_leavetemps_flag) |
|
| 606 |
+ if(ctx && !ctx->engine->keeptmp) |
|
| 607 | 607 |
if (cli_unlink(fullname)) |
| 608 | 608 |
ret = CL_EIO; |
| 609 | 609 |
free(fullname); |
| ... | ... |
@@ -760,13 +760,13 @@ ppt_stream_iter(int fd, const char *dir) |
| 760 | 760 |
} |
| 761 | 761 |
|
| 762 | 762 |
char * |
| 763 |
-cli_ppt_vba_read(int ifd) |
|
| 763 |
+cli_ppt_vba_read(int ifd, cli_ctx *ctx) |
|
| 764 | 764 |
{
|
| 765 | 765 |
char *dir; |
| 766 | 766 |
const char *ret; |
| 767 | 767 |
|
| 768 | 768 |
/* Create a directory to store the extracted OLE2 objects */ |
| 769 |
- dir = cli_gentemp(NULL); |
|
| 769 |
+ dir = cli_gentemp(ctx ? ctx->engine->tmpdir : NULL); |
|
| 770 | 770 |
if(dir == NULL) |
| 771 | 771 |
return NULL; |
| 772 | 772 |
if(mkdir(dir, 0700)) {
|
| ... | ... |
@@ -42,7 +42,7 @@ vba_project_t *cli_vba_readdir(const char *dir, struct uniq *U, uint32_t which); |
| 42 | 42 |
vba_project_t *cli_wm_readdir(int fd); |
| 43 | 43 |
unsigned char *cli_vba_inflate(int fd, off_t offset, int *size); |
| 44 | 44 |
int cli_scan_ole10(int fd, cli_ctx *ctx); |
| 45 |
-char *cli_ppt_vba_read(int fd); |
|
| 45 |
+char *cli_ppt_vba_read(int fd, cli_ctx *ctx); |
|
| 46 | 46 |
unsigned char *cli_wm_decrypt_macro(int fd, off_t offset, uint32_t len, |
| 47 | 47 |
unsigned char key); |
| 48 | 48 |
|
| ... | ... |
@@ -1084,7 +1084,7 @@ int sigtool_vba_scandir (const char *dirname, int hex_output, struct uniq *U) |
| 1084 | 1084 |
vbaname[sizeof(vbaname)-1] = '\0'; |
| 1085 | 1085 |
fd = open(vbaname, O_RDONLY|O_BINARY); |
| 1086 | 1086 |
if (fd == -1) continue; |
| 1087 |
- if ((fullname = cli_ppt_vba_read(fd))) {
|
|
| 1087 |
+ if ((fullname = cli_ppt_vba_read(fd, NULL))) {
|
|
| 1088 | 1088 |
sigtool_scandir(fullname, hex_output); |
| 1089 | 1089 |
cli_rmdirs(fullname); |
| 1090 | 1090 |
free(fullname); |