Browse code

Win32 cmd.exe doesn't like % in filenames

git-svn: trunk@2215

Nigel Horne authored on 2006/08/27 18:54:47
Showing 2 changed files
... ...
@@ -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