~yolanda.robla/ubuntu/saucy/clamav/dep-8-tests

« back to all changes in this revision

Viewing changes to libclamav/matcher.c

  • Committer: Bazaar Package Importer
  • Author(s): Scott Kitterman
  • Date: 2009-11-02 23:27:19 UTC
  • mfrom: (0.35.9 sid)
  • Revision ID: james.westby@ubuntu.com-20091102232719-61ay35095dhbuxfm
Tags: 0.95.3+dfsg-1ubuntu1
* Merge from debian unstable, remaining changes:
  - Drop build-dep on electric-fence (in Universe)
  - Build-dep on libltdl3-dev instead of libltdl-dev for updating earlier
    releases more easily
  - Add apparmor profiles for clamd and freshclam along with maintainer
    script changes

Show diffs side-by-side

added added

removed removed

Lines of Context:
76
76
        if(!acdata && (ret = cli_ac_initdata(&mdata, troot->ac_partsigs, troot->ac_lsigs, CLI_DEFAULT_AC_TRACKLEN)))
77
77
            return ret;
78
78
 
79
 
        if(troot->ac_only || (ret = cli_bm_scanbuff(buffer, length, virname, troot, offset, ftype, -1)) != CL_VIRUS)
 
79
        if(troot->ac_only || (ret = cli_bm_scanbuff(buffer, length, virname, NULL, troot, offset, ftype, -1)) != CL_VIRUS)
80
80
            ret = cli_ac_scanbuff(buffer, length, virname, NULL, NULL, troot, acdata ? (acdata[0]) : (&mdata), offset, ftype, -1, NULL, AC_SCAN_VIR, NULL);
81
81
 
82
82
        if(!acdata)
89
89
    if(!acdata && (ret = cli_ac_initdata(&mdata, groot->ac_partsigs, groot->ac_lsigs, CLI_DEFAULT_AC_TRACKLEN)))
90
90
        return ret;
91
91
 
92
 
    if(groot->ac_only || (ret = cli_bm_scanbuff(buffer, length, virname, groot, offset, ftype, -1)) != CL_VIRUS)
 
92
    if(groot->ac_only || (ret = cli_bm_scanbuff(buffer, length, virname, NULL, groot, offset, ftype, -1)) != CL_VIRUS)
93
93
        ret = cli_ac_scanbuff(buffer, length, virname, NULL, NULL, groot, acdata ? (acdata[1]) : (&mdata), offset, ftype, -1, NULL, AC_SCAN_VIR, NULL);
94
94
 
95
95
    if(!acdata)
207
207
int cli_checkfp(int fd, cli_ctx *ctx)
208
208
{
209
209
        unsigned char *digest;
 
210
        char md5[33];
 
211
        unsigned int i;
210
212
        const char *virname;
211
213
        off_t pos;
 
214
        struct stat sb;
 
215
        const struct cli_bm_patt *patt = NULL;
212
216
 
213
217
 
214
218
    if((pos = lseek(fd, 0, SEEK_CUR)) == -1) {
219
223
    lseek(fd, 0, SEEK_SET);
220
224
 
221
225
    if(ctx->engine->md5_fp) {
 
226
        if(fstat(fd, &sb) == -1) {
 
227
            cli_errmsg("cli_checkfp(): fstat(%d) failed\n", fd);
 
228
            lseek(fd, pos, SEEK_SET);
 
229
            return 0;
 
230
        }
 
231
 
222
232
        if(!(digest = cli_md5digest(fd))) {
223
233
            cli_errmsg("cli_checkfp(): Can't generate MD5 checksum\n");
224
234
            lseek(fd, pos, SEEK_SET);
225
235
            return 0;
226
236
        }
227
237
 
228
 
        if(cli_bm_scanbuff(digest, 16, &virname, ctx->engine->md5_fp, 0, 0, -1) == CL_VIRUS) {
 
238
        if(cli_bm_scanbuff(digest, 16, &virname, &patt, ctx->engine->md5_fp, 0, 0, -1) == CL_VIRUS && patt->filesize == sb.st_size) {
229
239
            cli_dbgmsg("cli_checkfp(): Found false positive detection (fp sig: %s)\n", virname);
230
240
            free(digest);
231
241
            lseek(fd, pos, SEEK_SET);
232
242
            return 1;
233
243
        }
 
244
        for(i = 0; i < 16; i++)
 
245
            sprintf(md5 + i * 2, "%02x", digest[i]);
 
246
        md5[32] = 0;
 
247
        cli_dbgmsg("FP SIGNATURE: %s:%u:%s\n", md5, (unsigned int) sb.st_size, *ctx->virname ? *ctx->virname : "Name");
234
248
        free(digest);
235
249
    }
236
250
 
342
356
            length += maxpatlen;
343
357
 
344
358
        if(troot) {
345
 
            if(troot->ac_only || (ret = cli_bm_scanbuff(upt, length, ctx->virname, troot, offset, ftype, desc)) != CL_VIRUS)
 
359
            if(troot->ac_only || (ret = cli_bm_scanbuff(upt, length, ctx->virname, NULL, troot, offset, ftype, desc)) != CL_VIRUS)
346
360
                ret = cli_ac_scanbuff(upt, length, ctx->virname, NULL, NULL, troot, &tdata, offset, ftype, desc, ftoffset, acmode, NULL);
347
361
 
348
362
            if(ret == CL_VIRUS) {
359
373
        }
360
374
 
361
375
        if(!ftonly) {
362
 
            if(groot->ac_only || (ret = cli_bm_scanbuff(upt, length, ctx->virname, groot, offset, ftype, desc)) != CL_VIRUS)
 
376
            if(groot->ac_only || (ret = cli_bm_scanbuff(upt, length, ctx->virname, NULL, groot, offset, ftype, desc)) != CL_VIRUS)
363
377
                ret = cli_ac_scanbuff(upt, length, ctx->virname, NULL, NULL, groot, &gdata, offset, ftype, desc, ftoffset, acmode, NULL);
364
378
 
365
379
            if(ret == CL_VIRUS) {
436
450
    }
437
451
 
438
452
    if(!ftonly && ctx->engine->md5_hdb) {
 
453
            const struct cli_bm_patt *patt;
 
454
            struct stat sb;
439
455
        cli_md5_final(digest, &md5ctx);
440
 
        if(cli_bm_scanbuff(digest, 16, ctx->virname, ctx->engine->md5_hdb, 0, 0, -1) == CL_VIRUS && (cli_bm_scanbuff(digest, 16, NULL, ctx->engine->md5_fp, 0, 0, -1) != CL_VIRUS))
 
456
        fstat(desc, &sb);
 
457
        if(cli_bm_scanbuff(digest, 16, ctx->virname, &patt, ctx->engine->md5_hdb, 0, 0, -1) == CL_VIRUS && patt->filesize == sb.st_size && (cli_bm_scanbuff(digest, 16, NULL, &patt, ctx->engine->md5_fp, 0, 0, -1) != CL_VIRUS || patt->filesize != sb.st_size))
441
458
            return CL_VIRUS;
442
459
    }
443
460