From 0c1bc9427c427fb7d65e09f42ab2716382011c5c Mon Sep 17 00:00:00 2001 From: Christophe Grenier Date: Sat, 26 Jul 2014 16:23:11 +0200 Subject: [PATCH] PhotoRec: stricter check for .mb files --- src/file_mb.c | 62 +++++++++++++++++++++++++++------------------------ 1 file changed, 33 insertions(+), 29 deletions(-) diff --git a/src/file_mb.c b/src/file_mb.c index 9e9bcaf9..760dcfb4 100644 --- a/src/file_mb.c +++ b/src/file_mb.c @@ -29,9 +29,9 @@ #include #include "types.h" #include "filegen.h" +#include "common.h" static void register_header_check_mb(file_stat_t *file_stat); -static int header_check_mb(const unsigned char *buffer, const unsigned int buffer_size, const unsigned int safe_header_only, const file_recovery_t *file_recovery, file_recovery_t *file_recovery_new); const file_hint_t file_hint_mb= { .extension="mb", @@ -43,36 +43,40 @@ const file_hint_t file_hint_mb= { .register_header_check=®ister_header_check_mb }; -static const unsigned char mb_header[8]= {'M','a','y','a','F','O','R','4'}; -static const unsigned char mb_header2[8]= {'M','A','Y','A','F','O','R','4'}; -static const unsigned char mp_header[8]= {'M','P','L','E','F','O','R','4'}; - -static void register_header_check_mb(file_stat_t *file_stat) +struct maya_header { - register_header_check(8, mb_header, sizeof(mb_header), &header_check_mb, file_stat); - register_header_check(8, mb_header2, sizeof(mb_header2), &header_check_mb, file_stat); - register_header_check(8, mp_header, sizeof(mp_header), &header_check_mb, file_stat); -} + char magic[4]; + uint32_t size; + char magic2[8]; +} __attribute__ ((__packed__)); static int header_check_mb(const unsigned char *buffer, const unsigned int buffer_size, const unsigned int safe_header_only, const file_recovery_t *file_recovery, file_recovery_t *file_recovery_new) { - if(memcmp(&buffer[8], mb_header, sizeof(mb_header))==0 || - memcmp(&buffer[8], mb_header2, sizeof(mb_header2))==0) - { - reset_file_recovery(file_recovery_new); - file_recovery_new->extension=file_hint_mb.extension; - file_recovery_new->min_filesize=8; - file_recovery_new->calculated_file_size=(uint64_t)(buffer[4]<<24)+(buffer[5]<<16)+(buffer[6]<<8)+buffer[7]+8; - file_recovery_new->data_check=&data_check_size; - file_recovery_new->file_check=&file_check_size; - return 1; - } - if(memcmp(&buffer[8], mp_header, sizeof(mp_header))==0) - { - reset_file_recovery(file_recovery_new); - file_recovery_new->extension="mp"; - file_recovery_new->min_filesize=8; - return 1; - } - return 0; + const struct maya_header *hdr=(const struct maya_header *)buffer; + if(memcmp(buffer,"FOR4",4)!=0 || be32(hdr->size) < 8) + return 0; + reset_file_recovery(file_recovery_new); + file_recovery_new->extension=file_hint_mb.extension; + file_recovery_new->min_filesize=16; + file_recovery_new->calculated_file_size=be32(hdr->size)+8; + file_recovery_new->data_check=&data_check_size; + file_recovery_new->file_check=&file_check_size; + return 1; +} + +static int header_check_mp(const unsigned char *buffer, const unsigned int buffer_size, const unsigned int safe_header_only, const file_recovery_t *file_recovery, file_recovery_t *file_recovery_new) +{ + if(memcmp(buffer,"FOR4",4)!=0) + return 0; + reset_file_recovery(file_recovery_new); + file_recovery_new->extension="mp"; + file_recovery_new->min_filesize=16; + return 1; +} + +static void register_header_check_mb(file_stat_t *file_stat) +{ + register_header_check(8, "MayaFOR4", 8, &header_check_mb, file_stat); + register_header_check(8, "MAYAFOR4", 8, &header_check_mb, file_stat); + register_header_check(8, "MPLEFOR4", 8, &header_check_mp, file_stat); }