git-svn: trunk@2215
Nigel Horne authored on 2006/08/27 18:54:47... | ... |
@@ -1,3 +1,9 @@ |
1 |
+Sun Aug 27 10:52:55 BST 2006 (njh) |
|
2 |
+---------------------------------- |
|
3 |
+ * libclamav/blob.c: Don't use % in filenames on Windows, since cmd.exe |
|
4 |
+ uses that to start environment variables |
|
5 |
+ Reported by Nico <tbb*hideout.ath.cx> |
|
6 |
+ |
|
1 | 7 |
Sat Aug 26 23:41:08 CEST 2006 (tk) |
2 | 8 |
---------------------------------- |
3 | 9 |
* libclamav/mspack: fix double close of file descriptor, patch from NJH |
... | ... |
@@ -16,7 +16,7 @@ |
16 | 16 |
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, |
17 | 17 |
* MA 02110-1301, USA. |
18 | 18 |
*/ |
19 |
-static char const rcsid[] = "$Id: blob.c,v 1.52 2006/07/25 15:09:45 njh Exp $"; |
|
19 |
+static char const rcsid[] = "$Id: blob.c,v 1.53 2006/08/27 09:51:31 njh Exp $"; |
|
20 | 20 |
|
21 | 21 |
#if HAVE_CONFIG_H |
22 | 22 |
#include "clamav-config.h" |
... | ... |
@@ -24,6 +24,7 @@ static char const rcsid[] = "$Id: blob.c,v 1.52 2006/07/25 15:09:45 njh Exp $"; |
24 | 24 |
|
25 | 25 |
#ifdef C_WINDOWS |
26 | 26 |
#include "stdafx.h" |
27 |
+#include <io.h> |
|
27 | 28 |
#endif |
28 | 29 |
|
29 | 30 |
#include <stdio.h> |
... | ... |
@@ -32,11 +33,7 @@ static char const rcsid[] = "$Id: blob.c,v 1.52 2006/07/25 15:09:45 njh Exp $"; |
32 | 32 |
#include <errno.h> |
33 | 33 |
#include <fcntl.h> |
34 | 34 |
|
35 |
-#ifdef C_WINDOWS |
|
36 |
-#include <io.h> |
|
37 |
-#endif |
|
38 |
- |
|
39 |
-#if HAVE_SYS_PARAM_H |
|
35 |
+#ifdef HAVE_SYS_PARAM_H |
|
40 | 36 |
#include <sys/param.h> /* for NAME_MAX */ |
41 | 37 |
#endif |
42 | 38 |
|
... | ... |
@@ -420,7 +417,7 @@ fileblobSetFilename(fileblob *fb, const char *dir, const char *filename) |
420 | 420 |
*/ |
421 | 421 |
snprintf(fullname, sizeof(fullname), "%s/clamavtmpXXXXXXXXXXXXX", dir); |
422 | 422 |
#elif defined(C_WINDOWS) |
423 |
- sprintf_s(fullname, sizeof(fullname) - 1, "%s/%.*sXXXXXX", dir, |
|
423 |
+ sprintf_s(fullname, sizeof(fullname) - 1, "%s\\%.*sXXXXXX", dir, |
|
424 | 424 |
(int)(sizeof(fullname) - 9 - strlen(dir)), filename); |
425 | 425 |
#else |
426 | 426 |
sprintf(fullname, "%s/%.*sXXXXXX", dir, |
... | ... |
@@ -441,16 +438,18 @@ fileblobSetFilename(fileblob *fb, const char *dir, const char *filename) |
441 | 441 |
} |
442 | 442 |
#elif defined(C_WINDOWS) |
443 | 443 |
cli_dbgmsg("fileblobSetFilename: _mktemp_s(%s)\n", fullname); |
444 |
- fd = _mktemp_s(fullname, sizeof(fullname)); |
|
445 |
- if((fd < 0) && (errno == EINVAL)) { |
|
446 |
- /* |
|
447 |
- * This happens with some Linux flavours when (mis)handling |
|
448 |
- * filenames with foreign characters |
|
449 |
- */ |
|
450 |
- sprintf_s(fullname, sizeof(fullname), "%s/clamavtmpXXXXXXXXXXXXX", dir); |
|
451 |
- cli_dbgmsg("fileblobSetFilename: retry as mkstemp(%s)\n", fullname); |
|
452 |
- fd = _mktemp_s(fullname, sizeof(fullname)); |
|
453 |
- } |
|
444 |
+ if(_mktemp_s(fullname, strlen(fullname) + 1) != 0) { |
|
445 |
+ char *name; |
|
446 |
+ |
|
447 |
+ /* _mktemp_s only allows 26 files */ |
|
448 |
+ cli_dbgmsg("fileblobSetFilename: _mktemp_s(%s) failed: %s\n", fullname, strerror(errno)); |
|
449 |
+ name = cli_gentemp(dir); |
|
450 |
+ if(name == NULL) |
|
451 |
+ return; |
|
452 |
+ fd = open(name, O_WRONLY|O_CREAT|O_EXCL|O_TRUNC|O_BINARY, 0600); |
|
453 |
+ free(name); |
|
454 |
+ } else |
|
455 |
+ fd = open(fullname, O_WRONLY|O_CREAT|O_EXCL|O_TRUNC|O_BINARY, 0600); |
|
454 | 456 |
#else |
455 | 457 |
cli_dbgmsg("fileblobSetFilename: mktemp(%s)\n", fullname); |
456 | 458 |
(void)mktemp(fullname); |
... | ... |
@@ -497,7 +496,7 @@ fileblobAddData(fileblob *fb, const unsigned char *data, size_t len) |
497 | 497 |
if(fb->ctx->scanned) |
498 | 498 |
*fb->ctx->scanned += (unsigned long)len / CL_COUNT_PRECISION; |
499 | 499 |
|
500 |
- if((len > 5) && (cli_scanbuff((char *)data, len, fb->ctx->virname, fb->ctx->engine, 0) == CL_VIRUS)) { |
|
500 |
+ if((len > 5) && (cli_scanbuff((char *)data, (unsigned int)len, fb->ctx->virname, fb->ctx->engine, 0) == CL_VIRUS)) { |
|
501 | 501 |
cli_dbgmsg("fileblobAddData: found %s\n", *fb->ctx->virname); |
502 | 502 |
fb->isInfected = 1; |
503 | 503 |
} |
... | ... |
@@ -545,7 +544,7 @@ sanitiseName(char *name) |
545 | 545 |
#endif |
546 | 546 |
/* Also check for tab - "Heinz Martin" <Martin@hemag.ch> */ |
547 | 547 |
#if defined(MSDOS) || defined(C_CYGWIN) || defined(WIN32) || defined(C_OS2) |
548 |
- if(strchr("/*?<>|\\\"+=,;:\t ", *name)) |
|
548 |
+ if(strchr("%/*?<>|\\\"+=,;:\t ", *name)) |
|
549 | 549 |
#else |
550 | 550 |
if(*name == '/') |
551 | 551 |
#endif |