binhex: scan partially extracted files

0.96
aCaB 16 years ago
parent c5bfb52e1a
commit a6cbdba9a3
  1. 22
      libclamav/binhex.c

@ -72,19 +72,19 @@ int cli_binhex(cli_ctx *ctx) {
while(1) { while(1) {
uint8_t b; uint8_t b;
if(!enc_todo || dec_done >= BH_FLUSH_SZ) { if(!enc_todo || dec_done >= BH_FLUSH_SZ) {
if(!enc_todo && !dec_done) {
cli_dbgmsg("cli_binhex: possibly truncated file\n");
break;
}
if(write_phase == IN_HEADER) { if(write_phase == IN_HEADER) {
uint32_t namelen = (uint32_t)decoded[0], hdrlen = 1 + namelen + 1 + 4 + 4 + 2; uint32_t namelen = (uint32_t)decoded[0], hdrlen = 1 + namelen + 1 + 4 + 4 + 2;
if(!dec_done) {
cli_dbgmsg("cli_binhex: file is empty\n");
break;
}
datalen = (decoded[hdrlen]<<24) | (decoded[hdrlen+1]<<16) | (decoded[hdrlen+2]<<8) | decoded[hdrlen+3]; datalen = (decoded[hdrlen]<<24) | (decoded[hdrlen+1]<<16) | (decoded[hdrlen+2]<<8) | decoded[hdrlen+3];
hdrlen += 4; hdrlen += 4;
reslen = (decoded[hdrlen]<<24) | (decoded[hdrlen+1]<<16) | (decoded[hdrlen+2]<<8) | decoded[hdrlen+3]; reslen = (decoded[hdrlen]<<24) | (decoded[hdrlen+1]<<16) | (decoded[hdrlen+2]<<8) | decoded[hdrlen+3];
hdrlen += 4 + 2; hdrlen += 4 + 2;
decoded[namelen+1] = 0; decoded[namelen+1] = 0;
if(dec_done <= hdrlen) { if(dec_done <= hdrlen) {
cli_dbgmsg("cli_binhex: possibly truncated file\n"); cli_dbgmsg("cli_binhex: file too short for header\n");
break; break;
} }
if((ret = cli_checklimits("cli_binhex(data)", ctx, datalen, 0, 0)) != CL_CLEAN) if((ret = cli_checklimits("cli_binhex(data)", ctx, datalen, 0, 0)) != CL_CLEAN)
@ -153,6 +153,18 @@ int cli_binhex(cli_ctx *ctx) {
break; break;
} }
} }
if(!enc_todo) {
if(write_phase == IN_DATA) {
cli_dbgmsg("cli_binhex: scanning partially extracted data fork\n");
lseek(datafd, 0, SEEK_SET);
ret = cli_magic_scandesc(datafd, ctx);
} else if(write_phase == IN_RES) {
cli_dbgmsg("cli_binhex: scanning partially extracted resource fork\n");
lseek(resfd, 0, SEEK_SET);
ret = cli_magic_scandesc(resfd, ctx);
}
break;
}
} }
if(!chunksz) { if(!chunksz) {

Loading…
Cancel
Save