PhotoRec: stricter check for .mb files

This commit is contained in:
Christophe Grenier 2014-07-26 16:23:11 +02:00
parent 617c63a47f
commit 0c1bc9427c

View file

@ -29,9 +29,9 @@
#include <stdio.h>
#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=&register_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);
}