From 5613d7c187d74df592880db01c8dcf5e310dc7e2 Mon Sep 17 00:00:00 2001 From: Christophe Grenier Date: Thu, 8 Feb 2018 18:16:47 +0100 Subject: [PATCH] fidentify: modfied for afl-clang-fast --- src/fidentify.c | 152 +++++++++++++++++++++++++----------------------- 1 file changed, 78 insertions(+), 74 deletions(-) diff --git a/src/fidentify.c b/src/fidentify.c index d32c5052..310bb427 100644 --- a/src/fidentify.c +++ b/src/fidentify.c @@ -60,83 +60,79 @@ extern file_check_list_t file_check_list; static int file_identify(const char *filename, const unsigned int check) { - FILE *file; - unsigned char *buffer_start; - unsigned char *buffer_olddata; - unsigned char *buffer; const unsigned int blocksize=65536; - const unsigned int read_size=65536; - unsigned int buffer_size; - file_recovery_t file_recovery; - reset_file_recovery(&file_recovery); - file_recovery.blocksize=blocksize; - buffer_size=blocksize + READ_SIZE; + const unsigned int buffer_size=blocksize + READ_SIZE; + unsigned char *buffer_start; + unsigned char *buffer; buffer_start=(unsigned char *)MALLOC(buffer_size); - buffer_olddata=buffer_start; - buffer=buffer_olddata + blocksize; - file=fopen(filename, "rb"); - if(file==NULL) - { - free(buffer_start); - return -1; - } - if(fread(buffer, 1, READ_SIZE, file)<=0) - { - fclose(file); - free(buffer_start); - return 0; - } - { - struct td_list_head *tmpl; - file_recovery_t file_recovery_new; - file_recovery_new.blocksize=blocksize; - file_recovery_new.file_stat=NULL; - td_list_for_each(tmpl, &file_check_list.list) - { - struct td_list_head *tmp; - const file_check_list_t *pos=td_list_entry_const(tmpl, const file_check_list_t, list); - td_list_for_each(tmp, &pos->file_checks[buffer[pos->offset]].list) - { - const file_check_t *file_check=td_list_entry_const(tmp, const file_check_t, list); - if((file_check->length==0 || memcmp(buffer + file_check->offset, file_check->value, file_check->length)==0) && - file_check->header_check(buffer, read_size, 0, &file_recovery, &file_recovery_new)!=0) - { - file_recovery_new.file_stat=file_check->file_stat; - break; - } - } - if(file_recovery_new.file_stat!=NULL) - break; - } - if(file_recovery_new.file_stat!=NULL && file_recovery_new.file_stat->file_hint!=NULL && - check > 0 && file_recovery_new.file_check!=NULL) - { - file_recovery_new.handle=file; - my_fseek(file_recovery_new.handle, 0, SEEK_END); -#ifdef HAVE_FTELLO - file_recovery_new.file_size=ftello(file_recovery_new.handle); -#else - file_recovery_new.file_size=ftell(file_recovery_new.handle); + buffer=buffer_start + blocksize; +#ifdef __AFL_COMPILER + while(__AFL_LOOP(10000)) #endif - file_recovery_new.calculated_file_size=file_recovery_new.file_size; - (file_recovery_new.file_check)(&file_recovery_new); - if(file_recovery_new.file_size < file_recovery_new.min_filesize) - file_recovery_new.file_size=0; - if(file_recovery_new.file_size==0) - file_recovery_new.file_stat=NULL; - } - if(file_recovery_new.file_stat!=NULL && file_recovery_new.file_stat->file_hint!=NULL) + { + FILE *file; + file=fopen(filename, "rb"); + if(file==NULL) { - printf("%s: %s", filename, - ((file_recovery_new.extension!=NULL && file_recovery_new.extension[0]!='\0')? - file_recovery_new.extension:file_recovery_new.file_stat->file_hint->description)); - if(check > 0 && file_recovery_new.file_check!=NULL) - printf(" file_size=%llu", (long long unsigned)file_recovery_new.file_size); - printf("\n"); + free(buffer_start); + return -1; } - else + if(fread(buffer, 1, READ_SIZE, file) >0) { - printf("%s: unknown\n", filename); + struct td_list_head *tmpl; + file_recovery_t file_recovery_new; + file_recovery_t file_recovery; + reset_file_recovery(&file_recovery); + file_recovery.blocksize=blocksize; + file_recovery_new.blocksize=blocksize; + file_recovery_new.file_stat=NULL; + td_list_for_each(tmpl, &file_check_list.list) + { + struct td_list_head *tmp; + const file_check_list_t *pos=td_list_entry_const(tmpl, const file_check_list_t, list); + td_list_for_each(tmp, &pos->file_checks[buffer[pos->offset]].list) + { + const file_check_t *file_check=td_list_entry_const(tmp, const file_check_t, list); + if((file_check->length==0 || memcmp(buffer + file_check->offset, file_check->value, file_check->length)==0) && + file_check->header_check(buffer, blocksize, 0, &file_recovery, &file_recovery_new)!=0) + { + file_recovery_new.file_stat=file_check->file_stat; + break; + } + } + if(file_recovery_new.file_stat!=NULL) + break; + } + if(file_recovery_new.file_stat!=NULL && file_recovery_new.file_stat->file_hint!=NULL && + check > 0 && file_recovery_new.file_check!=NULL) + { + file_recovery_new.handle=file; + my_fseek(file_recovery_new.handle, 0, SEEK_END); +#ifdef HAVE_FTELLO + file_recovery_new.file_size=ftello(file_recovery_new.handle); +#else + file_recovery_new.file_size=ftell(file_recovery_new.handle); +#endif + file_recovery_new.calculated_file_size=file_recovery_new.file_size; + (file_recovery_new.file_check)(&file_recovery_new); + if(file_recovery_new.file_size < file_recovery_new.min_filesize) + file_recovery_new.file_size=0; + if(file_recovery_new.file_size==0) + file_recovery_new.file_stat=NULL; + } + if(file_recovery_new.file_stat!=NULL && file_recovery_new.file_stat->file_hint!=NULL) + { + printf("%s: %s", filename, + ((file_recovery_new.extension!=NULL && file_recovery_new.extension[0]!='\0')? + file_recovery_new.extension:file_recovery_new.file_stat->file_hint->description)); + if(check > 0 && file_recovery_new.file_check!=NULL) + printf(" file_size=%llu", (long long unsigned)file_recovery_new.file_size); + printf("\n"); + } + else + { + printf("%s: unknown\n", filename); + } } fclose(file); } @@ -144,6 +140,7 @@ static int file_identify(const char *filename, const unsigned int check) return 0; } +#ifndef __AFL_COMPILER static void file_identify_dir(const char *current_dir, const unsigned int check) { DIR *dir; @@ -176,6 +173,7 @@ static void file_identify_dir(const char *current_dir, const unsigned int check) } closedir(dir); } +#endif static void display_help(void) { @@ -229,6 +227,7 @@ int main(int argc, char **argv) return 0; } } +#ifndef __AFL_COMPILER log_handle=log_open("fidentify.log", TD_LOG_CREATE, &log_errno); if(log_handle!=NULL) { @@ -245,6 +244,7 @@ int main(int argc, char **argv) log_flush(); } log_info("fidentify %s, Data Recovery Utility, %s\nChristophe GRENIER \nhttps://www.cgsecurity.org\n", VERSION, TESTDISKDATE); +#endif for(i=1; i