summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChristophe Grenier <[email protected]>2025-06-22 19:42:28 +0200
committerChristophe Grenier <[email protected]>2025-06-22 19:42:28 +0200
commit7b498fb65284cfc1f4723939f3b01c698182ef6a (patch)
tree0d86c6630f9c3bfcdf382e40dc63495673994d2c
parent10b50e009e1c98b77f7fcf3e1eb1fba3b8625974 (diff)
src/file_pdb.c: fix the size detection
-rw-r--r--src/file_pdb.c87
1 files changed, 54 insertions, 33 deletions
diff --git a/src/file_pdb.c b/src/file_pdb.c
index 480907f3..e6a767b6 100644
--- a/src/file_pdb.c
+++ b/src/file_pdb.c
@@ -44,53 +44,63 @@ const file_hint_t file_hint_pdb= {
};
/*@
- @ requires file_recovery->data_check==&data_check_pdb;
+ @ requires file_recovery->data_check==&data_check_pdb81;
@ requires valid_data_check_param(buffer, buffer_size, file_recovery);
@ terminates \true;
@ ensures valid_data_check_result(\result, file_recovery);
@ assigns file_recovery->calculated_file_size;
@*/
-static data_check_t data_check_pdb(const unsigned char *buffer, const unsigned int buffer_size, file_recovery_t *file_recovery)
+static data_check_t data_check_pdb81(const unsigned char *buffer, const unsigned int buffer_size, file_recovery_t *file_recovery)
{
unsigned int i;
/*@ assert file_recovery->calculated_file_size <= PHOTOREC_MAX_FILE_SIZE; */
/*@ assert file_recovery->file_size <= PHOTOREC_MAX_FILE_SIZE; */
/*@
- @ loop assigns i;
- @ loop variant buffer_size - i;
+ @ loop assigns file_recovery->calculated_file_size;
+ @ loop variant file_recovery->file_size + buffer_size/2 - (file_recovery->calculated_file_size + 81);
@*/
- for(i=buffer_size/2; i<buffer_size; i++)
- if(buffer[i]==0)
+ while(file_recovery->calculated_file_size + buffer_size/2 >= file_recovery->file_size &&
+ file_recovery->calculated_file_size + 81 <= file_recovery->file_size + buffer_size/2)
+ {
+ const unsigned int i=file_recovery->calculated_file_size + buffer_size/2 - file_recovery->file_size;
+ /*@ assert 0 <= i <= buffer_size - 81 ; */
+ if(buffer[i+80]!='\n')
{
- file_recovery->calculated_file_size+=i;
return DC_STOP;
}
- file_recovery->calculated_file_size+=buffer_size/2;
+ file_recovery->calculated_file_size+=81;
+ }
return DC_CONTINUE;
}
/*@
- @ requires file_recovery->file_check == &file_check_pdb;
- @ requires valid_file_check_param(file_recovery);
- @ ensures valid_file_check_result(file_recovery);
- @ assigns *file_recovery->handle, errno, file_recovery->file_size;
- @ assigns Frama_C_entropy_source;
+ @ requires file_recovery->data_check==&data_check_pdb82;
+ @ requires valid_data_check_param(buffer, buffer_size, file_recovery);
+ @ terminates \true;
+ @ ensures valid_data_check_result(\result, file_recovery);
+ @ assigns file_recovery->calculated_file_size;
@*/
-static void file_check_pdb(file_recovery_t *file_recovery)
+static data_check_t data_check_pdb82(const unsigned char *buffer, const unsigned int buffer_size, file_recovery_t *file_recovery)
{
- char buffer[512];
- if(my_fseek(file_recovery->handle, 0, SEEK_SET) < 0 ||
- fread(&buffer, 1, sizeof(buffer), file_recovery->handle) < 82)
- return ;
-#if defined(__FRAMAC__)
- Frama_C_make_unknown(buffer, sizeof(buffer));
-#endif
- if(buffer[80]=='\r' && buffer[81]=='\n')
- file_recovery->file_size=file_recovery->calculated_file_size/82*82;
- else if(buffer[80]=='\n')
- file_recovery->file_size=file_recovery->calculated_file_size/81*81;
- else
- file_recovery->file_size=0;
+ unsigned int i;
+ /*@ assert file_recovery->calculated_file_size <= PHOTOREC_MAX_FILE_SIZE; */
+ /*@ assert file_recovery->file_size <= PHOTOREC_MAX_FILE_SIZE; */
+ /*@
+ @ loop assigns file_recovery->calculated_file_size;
+ @ loop variant file_recovery->file_size + buffer_size/2 - (file_recovery->calculated_file_size + 82);
+ @*/
+ while(file_recovery->calculated_file_size + buffer_size/2 >= file_recovery->file_size &&
+ file_recovery->calculated_file_size + 82 <= file_recovery->file_size + buffer_size/2)
+ {
+ const unsigned int i=file_recovery->calculated_file_size + buffer_size/2 - file_recovery->file_size;
+ /*@ assert 0 <= i <= buffer_size - 82 ; */
+ if(buffer[i+80]!='\r' || buffer[i+81]!='\n')
+ {
+ return DC_STOP;
+ }
+ file_recovery->calculated_file_size+=82;
+ }
+ return DC_CONTINUE;
}
/*@
@@ -117,12 +127,23 @@ static int header_check_pdb(const unsigned char *buffer, const unsigned int buff
/* Check space */
if(buffer[59]!=' ' || buffer[60]!=' ' || buffer[61]!=' ' || buffer[66]!=' ' || buffer[67]!=' ' || buffer[68]!=' ' || buffer[69]!=' ')
return 0;
- reset_file_recovery(file_recovery_new);
- file_recovery_new->extension=file_hint_pdb.extension;
- file_recovery_new->data_check=&data_check_pdb;
- file_recovery_new->file_check=&file_check_pdb;
- file_recovery_new->min_filesize=80;
- return 1;
+ if(buffer[80]=='\r' && buffer[81]=='\n')
+ {
+ reset_file_recovery(file_recovery_new);
+ file_recovery_new->extension=file_hint_pdb.extension;
+ file_recovery_new->data_check=&data_check_pdb82;
+ file_recovery_new->min_filesize=82;
+ return 1;
+ }
+ if(buffer[80]=='\n')
+ {
+ reset_file_recovery(file_recovery_new);
+ file_recovery_new->extension=file_hint_pdb.extension;
+ file_recovery_new->data_check=&data_check_pdb81;
+ file_recovery_new->min_filesize=81;
+ return 1;
+ }
+ return 0;
}
static void register_header_check_pdb(file_stat_t *file_stat)