~ubuntu-branches/ubuntu/raring/clamav/raring

« back to all changes in this revision

Viewing changes to libclamav/matcher.c

  • Committer: Bazaar Package Importer
  • Author(s): Stephen Gran
  • Date: 2008-09-05 17:25:34 UTC
  • mfrom: (0.35.1 lenny)
  • Revision ID: james.westby@ubuntu.com-20080905172534-yi3f8fkye1o7u1r3
* New upstream version (closes: #497662, #497773)
  - lots of new options for clamd.conf
  - fixes CVEs CVE-2008-3912, CVE-2008-3913, CVE-2008-3914, and
    CVE-2008-1389
* No longer supports --unzip option, so typo is gone (closes: #496276)
* Translations:
  - sv (thanks Martin Bagge <brother@bsnet.se>) (closes: #491760)

Show diffs side-by-side

added added

removed removed

Lines of Context:
72
72
 
73
73
    if(troot) {
74
74
 
75
 
        if((ret = cli_ac_initdata(&mdata, troot->ac_partsigs, AC_DEFAULT_TRACKLEN)))
 
75
        if((ret = cli_ac_initdata(&mdata, troot->ac_partsigs, troot->ac_lsigs, AC_DEFAULT_TRACKLEN)))
76
76
            return ret;
77
77
 
78
78
        if(troot->ac_only || (ret = cli_bm_scanbuff(buffer, length, virname, troot, 0, ftype, -1)) != CL_VIRUS)
79
 
            ret = cli_ac_scanbuff(buffer, length, virname, troot, &mdata, 0, ftype, -1, NULL, AC_SCAN_VIR, NULL);
 
79
            ret = cli_ac_scanbuff(buffer, length, virname, NULL, NULL, troot, &mdata, 0, ftype, -1, NULL, AC_SCAN_VIR, NULL);
80
80
 
81
81
        cli_ac_freedata(&mdata);
82
82
 
84
84
            return ret;
85
85
    }
86
86
 
87
 
    if((ret = cli_ac_initdata(&mdata, groot->ac_partsigs, AC_DEFAULT_TRACKLEN)))
 
87
    if((ret = cli_ac_initdata(&mdata, groot->ac_partsigs, groot->ac_lsigs, AC_DEFAULT_TRACKLEN)))
88
88
        return ret;
89
89
 
90
90
    if(groot->ac_only || (ret = cli_bm_scanbuff(buffer, length, virname, groot, 0, ftype, -1)) != CL_VIRUS)
91
 
        ret = cli_ac_scanbuff(buffer, length, virname, groot, &mdata, 0, ftype, -1, NULL, AC_SCAN_VIR, NULL);
 
91
        ret = cli_ac_scanbuff(buffer, length, virname, NULL, NULL, groot, &mdata, 0, ftype, -1, NULL, AC_SCAN_VIR, NULL);
92
92
 
93
93
    cli_ac_freedata(&mdata);
94
94
 
251
251
int cli_scandesc(int desc, cli_ctx *ctx, cli_file_t ftype, uint8_t ftonly, struct cli_matched_type **ftoffset, unsigned int acmode)
252
252
{
253
253
        unsigned char *buffer, *buff, *endbl, *upt;
254
 
        int ret = CL_CLEAN, type = CL_CLEAN, i, bytes;
 
254
        int ret = CL_CLEAN, type = CL_CLEAN, bytes;
 
255
        unsigned int i, evalcnt;
255
256
        uint32_t buffersize, length, maxpatlen, shift = 0, offset = 0;
 
257
        uint64_t evalids;
256
258
        struct cli_ac_data gdata, tdata;
257
259
        cli_md5_ctx md5ctx;
258
260
        unsigned char digest[16];
295
297
        return CL_EMEM;
296
298
    }
297
299
 
298
 
    if(!ftonly && (ret = cli_ac_initdata(&gdata, groot->ac_partsigs, AC_DEFAULT_TRACKLEN)))
 
300
    if(!ftonly && (ret = cli_ac_initdata(&gdata, groot->ac_partsigs, groot->ac_lsigs, AC_DEFAULT_TRACKLEN)))
299
301
        return ret;
300
302
 
301
303
    if(troot) {
302
 
        if((ret = cli_ac_initdata(&tdata, troot->ac_partsigs, AC_DEFAULT_TRACKLEN)))
 
304
        if((ret = cli_ac_initdata(&tdata, troot->ac_partsigs, troot->ac_lsigs, AC_DEFAULT_TRACKLEN)))
303
305
            return ret;
304
306
    }
305
307
 
324
326
 
325
327
        if(troot) {
326
328
            if(troot->ac_only || (ret = cli_bm_scanbuff(upt, length, ctx->virname, troot, offset, ftype, desc)) != CL_VIRUS)
327
 
                ret = cli_ac_scanbuff(upt, length, ctx->virname, troot, &tdata, offset, ftype, desc, ftoffset, acmode, NULL);
 
329
                ret = cli_ac_scanbuff(upt, length, ctx->virname, NULL, NULL, troot, &tdata, offset, ftype, desc, ftoffset, acmode, NULL);
328
330
 
329
331
            if(ret == CL_VIRUS) {
330
332
                free(buffer);
342
344
 
343
345
        if(!ftonly) {
344
346
            if(groot->ac_only || (ret = cli_bm_scanbuff(upt, length, ctx->virname, groot, offset, ftype, desc)) != CL_VIRUS)
345
 
                ret = cli_ac_scanbuff(upt, length, ctx->virname, groot, &gdata, offset, ftype, desc, ftoffset, acmode, NULL);
 
347
                ret = cli_ac_scanbuff(upt, length, ctx->virname, NULL, NULL, groot, &gdata, offset, ftype, desc, ftoffset, acmode, NULL);
346
348
 
347
349
            if(ret == CL_VIRUS) {
348
350
                free(buffer);
378
380
        } else {
379
381
            shift += bytes;
380
382
        }
381
 
 
382
383
    }
383
384
 
384
385
    free(buffer);
385
 
    if(!ftonly)
 
386
 
 
387
    if(troot) {
 
388
        for(i = 0; i < troot->ac_lsigs; i++) {
 
389
            evalcnt = 0;
 
390
            evalids = 0;
 
391
            if(cli_ac_chklsig(troot->ac_lsigtable[i]->logic, troot->ac_lsigtable[i]->logic + strlen(troot->ac_lsigtable[i]->logic), tdata.lsigcnt[i], &evalcnt, &evalids, 0) == 1) {
 
392
                if(ctx->virname)
 
393
                    *ctx->virname = troot->ac_lsigtable[i]->virname;
 
394
                ret = CL_VIRUS;
 
395
                break;
 
396
            }
 
397
        }
 
398
        cli_ac_freedata(&tdata);
 
399
    }
 
400
 
 
401
    if(groot) {
 
402
        if(ret != CL_VIRUS) for(i = 0; i < groot->ac_lsigs; i++) {
 
403
            evalcnt = 0;
 
404
            evalids = 0;
 
405
            if(cli_ac_chklsig(groot->ac_lsigtable[i]->logic, groot->ac_lsigtable[i]->logic + strlen(groot->ac_lsigtable[i]->logic), gdata.lsigcnt[i], &evalcnt, &evalids, 0) == 1) {
 
406
                if(ctx->virname)
 
407
                    *ctx->virname = groot->ac_lsigtable[i]->virname;
 
408
                ret = CL_VIRUS;
 
409
                break;
 
410
            }
 
411
        }
386
412
        cli_ac_freedata(&gdata);
387
 
    if(troot)
388
 
        cli_ac_freedata(&tdata);
 
413
    }
 
414
 
 
415
    if(ret == CL_VIRUS) {
 
416
        lseek(desc, 0, SEEK_SET);
 
417
        if(cli_checkfp(desc, ctx->engine))
 
418
            return CL_CLEAN;
 
419
        else
 
420
            return CL_VIRUS;
 
421
    }
389
422
 
390
423
    if(!ftonly && ctx->engine->md5_hdb) {
391
424
        cli_md5_final(digest, &md5ctx);