495
fileblobPartialSet(fileblob *fb, const char *fullname, const char *arg)
500
assert(fullname != NULL);
502
cli_dbgmsg("fileblobPartialSet: saving to %s\n", fullname);
504
fb->fd = open(fullname, O_WRONLY|O_CREAT|O_TRUNC|O_BINARY|O_EXCL, 0600);
506
cli_errmsg("fileblobPartialSet: unable to create file: %s\n",fullname);
509
fb->fp = fdopen(fb->fd, "wb");
512
cli_errmsg("fileblobSetFilename: fdopen failed (%s)\n", strerror(errno));
516
blobSetFilename(&fb->b, NULL, fullname);
518
if(fileblobAddData(fb, fb->b.data, fb->b.len) == 0) {
521
fb->b.len = fb->b.size = 0;
524
fb->fullname = cli_strdup(fullname);
497
528
fileblobSetFilename(fileblob *fb, const char *dir, const char *filename)
500
char fullname[NAME_MAX + 1];
514
544
filename = blobGetFilename(&fb->b);
516
546
assert(filename != NULL);
520
* QNX6 support from mikep@kaluga.org to fix bug where mkstemp
521
* can return ETOOLONG even when the file name isn't too long
523
snprintf(fullname, sizeof(fullname), "%s/clamavtmpXXXXXXXXXXXXX", dir);
524
#elif defined(C_WINDOWS)
525
sprintf_s(fullname, sizeof(fullname) - 1, "%s\\%.*sXXXXXX", dir,
526
(int)(sizeof(fullname) - 9 - strlen(dir)), filename);
528
sprintf(fullname, "%s/%.*sXXXXXX", dir,
529
(int)(sizeof(fullname) - 9 - strlen(dir)), filename);
532
#if defined(C_LINUX) || defined(C_BSD) || defined(HAVE_MKSTEMP) || defined(C_SOLARIS) || defined(C_CYGWIN) || defined(C_QNX6)
533
cli_dbgmsg("fileblobSetFilename: mkstemp(%s)\n", fullname);
535
* On older Cygwin, mkstemp opened in O_TEXT mode, rather than
536
* O_BINARY. I understand this is now fixed, but I don't know in
538
* See http://cygwin.com/ml/cygwin-patches/2006-q2/msg00014.html
540
fd = mkstemp(fullname);
541
if((fd < 0) && (errno == EINVAL)) {
543
* This happens with some Linux flavours when (mis)handling
544
* filenames with foreign characters
546
snprintf(fullname, sizeof(fullname), "%s/clamavtmpXXXXXXXXXXXXX", dir);
547
cli_dbgmsg("fileblobSetFilename: retry as mkstemp(%s)\n", fullname);
548
fd = mkstemp(fullname);
550
#elif defined(C_WINDOWS)
551
cli_dbgmsg("fileblobSetFilename: _mktemp_s(%s)\n", fullname);
552
if(_mktemp_s(fullname, strlen(fullname) + 1) != 0) {
555
/* _mktemp_s only allows 26 files */
556
cli_dbgmsg("fileblobSetFilename: _mktemp_s(%s) failed: %s\n", fullname, strerror(errno));
557
name = cli_gentemp(dir);
560
fd = open(name, O_WRONLY|O_CREAT|O_EXCL|O_TRUNC|O_BINARY, 0600);
562
strncpy(fullname, name, sizeof(fullname) - 1);
565
fd = open(fullname, O_WRONLY|O_CREAT|O_EXCL|O_TRUNC|O_BINARY, 0600);
567
cli_dbgmsg("fileblobSetFilename: mktemp(%s)\n", fullname);
568
(void)mktemp(fullname);
569
fd = open(fullname, O_WRONLY|O_CREAT|O_EXCL|O_TRUNC|O_BINARY, 0600);
573
cli_errmsg("Can't create temporary file %s: %s\n", fullname, strerror(errno));
574
cli_dbgmsg("%lu %lu\n", (unsigned long)sizeof(fullname),
575
(unsigned long)strlen(fullname));
579
cli_dbgmsg("Creating %s\n", fullname);
581
fb->fp = fdopen(fd, "wb");
548
if (cli_gentempfd(dir, &fullname, &fb->fd)!=CL_SUCCESS) return;
550
cli_dbgmsg("fileblobSetFilename: file %s saved to %s\n", filename, fullname);
552
fb->fp = fdopen(fb->fd, "wb");
583
554
if(fb->fp == NULL) {
584
cli_errmsg("Can't create file %s: %s\n", fullname, strerror(errno));
585
cli_dbgmsg("%lu %lu\n", (unsigned long)sizeof(fullname),
586
(unsigned long)strlen(fullname));
555
cli_errmsg("fileblobSetFilename: fdopen failed (%s)\n", strerror(errno));
688
649
cli_dbgmsg("fileblobScan, ctx == NULL\n");
689
650
return CL_CLEAN; /* there is no CL_UNKNOWN */
693
* FIXME: On Windows, cli_readn gives "bad file descriptor" when called
694
* by cli_check_mydoom_log from the call to cli_magic_scandesc here
695
* which implies that the file descriptor is getting closed somewhere,
696
* but I can't see where.
697
* One possible fix would be to duplicate cli_scanfile here.
700
fd = dup(fileno(fb->fp));
702
cli_warnmsg("%s: dup failed\n", fb->fullname);
705
/* cli_scanfile is static :-( */
706
/*if(cli_scanfile(fb->fullname, fb->ctx) == CL_VIRUS) {
707
cli_dbgmsg("%s is infected\n", fb->fullname);
711
rc = cli_magic_scandesc(fd, fb->ctx);
654
lseek(fb->fd, 0, SEEK_SET);
655
rc = cli_magic_scandesc(fb->fd, fb->ctx);
713
657
if(rc == CL_CLEAN) {
714
lseek(fd, 0, SEEK_SET);
715
ftype = cli_filetype2(fd, fb->ctx->engine);
658
lseek(fb->fd, 0, SEEK_SET);
659
ftype = cli_filetype2(fb->fd, fb->ctx->engine);
716
660
if(ftype >= CL_TYPE_TEXT_ASCII && ftype <= CL_TYPE_TEXT_UTF16BE) {
717
lseek(fd, 0, SEEK_SET);
718
rc = cli_scandesc(fd, fb->ctx, CL_TYPE_MAIL, 0, NULL, AC_SCAN_VIR);
661
lseek(fb->fd, 0, SEEK_SET);
662
rc = cli_scandesc(fb->fd, fb->ctx, CL_TYPE_MAIL, 0, NULL, AC_SCAN_VIR);
724
666
if(rc == CL_VIRUS) {
725
667
cli_dbgmsg("%s is infected\n", fb->fullname);
728
670
cli_dbgmsg("%s is clean\n", fb->fullname);
731
/* Ensure that the file is saved and scanned */
732
return CL_CLEAN; /* there is no CL_UNKNOWN :-( */