diff options
author | Christophe Grenier <[email protected]> | 2014-08-13 08:42:39 +0200 |
---|---|---|
committer | Christophe Grenier <[email protected]> | 2014-08-13 08:42:39 +0200 |
commit | 918dbd1be09261e94bdf623b5e631566a5dad87c (patch) | |
tree | 7ebd97426817f1e95d9ff615eda13a0615a38145 | |
parent | 1a953811a014dbd30f3dd5735737b0b98f22165d (diff) |
PhotoRec: stricter check for .flp
-rw-r--r-- | src/file_flp.c | 44 |
1 files changed, 28 insertions, 16 deletions
diff --git a/src/file_flp.c b/src/file_flp.c index 22e63190..bfa0a68c 100644 --- a/src/file_flp.c +++ b/src/file_flp.c @@ -29,6 +29,7 @@ #include <stdio.h> #include "types.h" #include "filegen.h" +#include "common.h" static void register_header_check_flp(file_stat_t *file_stat); static int header_check_flp(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); @@ -43,25 +44,36 @@ const file_hint_t file_hint_flp= { .register_header_check=®ister_header_check_flp }; -/* File format is similar to a midi file. - * It begins by a header chunk and is followed by a single track chunk */ -static const unsigned char flp_header[8]= {'F', 'L', 'h', 'd', 0x06, 0x00, 0x00, 0x00}; +struct flp_header +{ + char magic[4]; + uint32_t len; /* = 6 */ + uint16_t format; + uint16_t tracks; + int16_t time_division; + char magic2[4]; + uint32_t len2; +} __attribute__ ((__packed__)); -static void register_header_check_flp(file_stat_t *file_stat) +static int header_check_flp(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) { - register_header_check(0, flp_header,sizeof(flp_header), &header_check_flp, file_stat); + const struct flp_header *hdr=(const struct flp_header *)buffer; + if(strncmp(hdr->magic2, "FLdt", 4)!=0) + return 0; + if(le32(hdr->len2)==0) + return 0; + reset_file_recovery(file_recovery_new); + file_recovery_new->extension=file_hint_flp.extension; + file_recovery_new->calculated_file_size=le32(hdr->len2) + 0x16; + file_recovery_new->data_check=&data_check_size; + file_recovery_new->file_check=&file_check_size; + return 1; } -static int header_check_flp(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) +/* File format is similar to a midi file. + * It begins by a header chunk and is followed by a single track chunk */ +static void register_header_check_flp(file_stat_t *file_stat) { - if(memcmp(buffer, flp_header, sizeof(flp_header))==0) - { - reset_file_recovery(file_recovery_new); - file_recovery_new->extension=file_hint_flp.extension; - file_recovery_new->calculated_file_size=(uint64_t)buffer[0x12]+(((uint64_t)buffer[0x13])<<8)+(((uint64_t)buffer[0x14])<<16)+(((uint64_t)buffer[0x15])<<24) + 0x16; - file_recovery_new->data_check=&data_check_size; - file_recovery_new->file_check=&file_check_size; - return 1; - } - return 0; + static const unsigned char flp_header[8]= {'F', 'L', 'h', 'd', 0x06, 0x00, 0x00, 0x00}; + register_header_check(0, flp_header,sizeof(flp_header), &header_check_flp, file_stat); } |