~ubuntu-branches/ubuntu/breezy/clamav/breezy-backports

« back to all changes in this revision

Viewing changes to libclamav/cvd.c

  • Committer: Bazaar Package Importer
  • Author(s): Stephen Gran
  • Date: 2005-09-19 09:05:59 UTC
  • mfrom: (1.1.1 upstream)
  • Revision ID: james.westby@ubuntu.com-20050919090559-hikpqduq8yx5qxo2
Tags: 0.87-1
* New upstream version
  - Fixes CAN-2005-2920 and CAN-2005-2919 (closes: #328660)
* New logcheck line for clamav-daemon (closes: #323132)
* relibtoolize and apply kfreebsd patch (closes: #327707)
* Make sure init.d script starts freshclam up again after upgrade when run
  from if-up.d (closes: #328912)

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
1
/*
2
 
 *  Copyright (C) 2003 - 2004 Tomasz Kojm <tkojm@clamav.net>
 
2
 *  Copyright (C) 2003 - 2005 Tomasz Kojm <tkojm@clamav.net>
3
3
 *
4
4
 *  untgz() is based on public domain minitar utility by Charles G. Waldman
5
5
 *
29
29
#include <sys/stat.h>
30
30
#include <fcntl.h>
31
31
#include <zlib.h>
 
32
#include <time.h>
32
33
 
33
34
#include "clamav.h"
34
35
#include "others.h"
76
77
 
77
78
            strncpy(name, block, 100);
78
79
            name[100] = '\0';
 
80
 
 
81
            if(strchr(name, '/')) {
 
82
                cli_errmsg("Slash separators are not allowed in CVD.\n");
 
83
                free(fullname);
 
84
                gzclose(infile);
 
85
                return -1;
 
86
            }
 
87
 
79
88
            strcpy(fullname, destdir);
80
89
            strcat(fullname, "/");
81
90
            strcat(fullname, name);
124
133
                cli_errmsg("Invalid size in header.\n");
125
134
                free(fullname);
126
135
                gzclose(infile);
 
136
                fclose(outfile);
127
137
                return -1;
128
138
            }
129
139
 
221
231
        return NULL;
222
232
    }
223
233
 
 
234
    if((pt = cli_strtok(head, 8, ":"))) {
 
235
        cvd->stime = atoi(pt);
 
236
        free(pt);
 
237
    } else
 
238
        cli_dbgmsg("CVD -> No creation time in seconds (old file format)\n");
 
239
 
 
240
 
224
241
    return cvd;
225
242
}
226
243
 
235
252
        return NULL;
236
253
    }
237
254
 
238
 
    if((i=fread(head, 1, 512, fd)) != 512) {
 
255
    if((i = fread(head, 1, 512, fd)) != 512) {
239
256
        cli_dbgmsg("Short read (%d) while reading CVD head from %s\n", i, file);
240
257
        fclose(fd);
241
258
        return NULL;
258
275
    free(cvd);
259
276
}
260
277
 
261
 
int cli_cvdverify(FILE *fd)
 
278
int cli_cvdverify(FILE *fd, struct cl_cvd *cvdpt)
262
279
{
263
280
        struct cl_cvd *cvd;
264
281
        char *md5, head[513];
276
293
    if((cvd = cl_cvdparse(head)) == NULL)
277
294
        return CL_ECVD;
278
295
 
 
296
    if(cvdpt)
 
297
        memcpy(cvdpt, cvd, sizeof(struct cl_cvd));
279
298
 
280
 
    md5 = cli_md5stream(fd);
 
299
    md5 = cli_md5stream(fd, NULL);
281
300
    cli_dbgmsg("MD5(.tar.gz) = %s\n", md5);
282
301
 
283
302
    if(strncmp(md5, cvd->md5, 32)) {
311
330
        return CL_EOPEN;
312
331
    }
313
332
 
314
 
    ret = cli_cvdverify(fd);
 
333
    ret = cli_cvdverify(fd, NULL);
315
334
    fclose(fd);
316
335
 
317
336
    return ret;
318
337
}
319
338
 
320
 
int cli_cvdload(FILE *fd, struct cl_node **root, int *virnum)
 
339
int cli_cvdload(FILE *fd, struct cl_node **root, unsigned int *signo, short warn)
321
340
{
322
341
        char *dir, *tmp, *buffer;
 
342
        struct cl_cvd cvd;
323
343
        int bytes, ret;
324
 
        const char *tmpdir;
325
344
        FILE *tmpd;
 
345
        time_t stime;
 
346
 
326
347
 
327
348
    cli_dbgmsg("in cli_cvdload()\n");
328
349
 
329
350
    /* verify */
330
351
 
331
 
    if((ret = cli_cvdverify(fd)))
 
352
    if((ret = cli_cvdverify(fd, &cvd)))
332
353
        return ret;
333
354
 
 
355
    if(cvd.stime && warn) {
 
356
        time(&stime);
 
357
        if((int) stime - cvd.stime > 604800) {
 
358
            cli_warnmsg("**************************************************\n");
 
359
            cli_warnmsg("***  The virus database is older than 7 days.  ***\n");
 
360
            cli_warnmsg("***        Please update it IMMEDIATELY!       ***\n");
 
361
            cli_warnmsg("**************************************************\n");
 
362
        }
 
363
    }
 
364
 
 
365
    if(cvd.fl > cl_retflevel()) {
 
366
        cli_warnmsg("********************************************************\n");
 
367
        cli_warnmsg("***  This version of the ClamAV engine is outdated.  ***\n");
 
368
        cli_warnmsg("*** DON'T PANIC! Read http://www.clamav.net/faq.html ***\n");
 
369
        cli_warnmsg("********************************************************\n");
 
370
    }
 
371
 
334
372
    fseek(fd, 512, SEEK_SET);
335
373
 
336
 
    tmpdir = getenv("TMPDIR");
337
 
 
338
 
    if(tmpdir == NULL)
339
 
#ifdef P_tmpdir
340
 
        tmpdir = P_tmpdir;
341
 
#else
342
 
        tmpdir = "/tmp";
343
 
#endif
344
 
 
345
 
    dir = cl_gentemp(tmpdir);
 
374
    dir = cli_gentemp(NULL);
346
375
    if(mkdir(dir, 0700)) {
347
376
        cli_errmsg("cli_cvdload():  Can't create temporary directory %s\n", dir);
348
377
        return CL_ETMPDIR;
361
390
 
362
391
            /* start */
363
392
 
364
 
            tmp = cl_gentemp(tmpdir);
 
393
            tmp = cli_gentemp(NULL);
365
394
            if((tmpd = fopen(tmp, "wb+")) == NULL) {
366
395
                cli_errmsg("Can't create temporary file %s\n", tmp);
367
396
                free(dir);
369
398
                return CL_ETMPFILE;
370
399
            }
371
400
 
372
 
            if(!(buffer = (char *) cli_malloc(FILEBUFF)))
 
401
            if(!(buffer = (char *) cli_malloc(FILEBUFF))) {
 
402
                free(dir);
 
403
                free(tmp);
 
404
                fclose(tmpd);
373
405
                return CL_EMEM;
 
406
            }
374
407
 
375
408
            while((bytes = fread(buffer, 1, FILEBUFF, fd)) > 0)
376
409
                fwrite(buffer, 1, bytes, tmpd);
381
414
            fseek(tmpd, 0L, SEEK_SET);
382
415
 
383
416
            if(cli_untgz(fileno(tmpd), dir)) {
 
417
                perror("cli_untgz");
384
418
                cli_errmsg("cli_cvdload(): Can't unpack CVD file.\n");
385
419
                cli_rmdirs(dir);
386
420
                free(dir);
 
421
                fclose(tmpd);
387
422
                unlink(tmp);
388
423
                free(tmp);
389
424
                return CL_ECVDEXTR;
396
431
            /* end */
397
432
 
398
433
    /* load extracted directory */
399
 
    cl_loaddbdir(dir, root, virnum);
 
434
    cl_loaddbdir(dir, root, signo);
400
435
 
401
436
    cli_rmdirs(dir);
402
437
    free(dir);