diff options
Diffstat (limited to 'src/file_tiff_le.c')
-rw-r--r-- | src/file_tiff_le.c | 121 |
1 files changed, 43 insertions, 78 deletions
diff --git a/src/file_tiff_le.c b/src/file_tiff_le.c index 4d376013..2c697eea 100644 --- a/src/file_tiff_le.c +++ b/src/file_tiff_le.c @@ -416,57 +416,12 @@ static uint64_t tiff_le_makernote(FILE *in, const uint32_t tiff_diroff) #endif #if !defined(MAIN_tiff_be) && !defined(MAIN_jpg) && !defined(SINGLE_FORMAT_jpg) -static uint64_t file_check_tiff_le_aux(file_recovery_t *fr, const uint32_t tiff_diroff, const unsigned int depth, const unsigned int count); - /*@ - @ requires \valid(fr); - @ requires \valid(fr->handle); - @ requires valid_file_recovery(fr); - @ requires \valid_read(&fr->extension); + @ requires valid_file_check_param(fr); @ requires valid_read_string(fr->extension); - @ requires separation: \separated(fr, fr->handle, &errno, &Frama_C_entropy_source); - @ requires \valid_read(buffer + (0 .. buffer_size - 1)); - @ ensures \valid(fr); - @ ensures \valid(fr->handle); - @ ensures valid_read_string(fr->extension); - @ assigns *fr->handle, errno; - @ assigns Frama_C_entropy_source; - @*/ -static uint64_t file_check_tiff_le_aux_next(file_recovery_t *fr, const unsigned int depth, const unsigned int count, const unsigned char *buffer, const unsigned int buffer_size, const unsigned int offset_ptr_offset) -{ - if(buffer_size < 4) - return 0; - /*@ assert buffer_size >= 4; */ - if(offset_ptr_offset > buffer_size-4) - return 0; - { - /*@ assert offset_ptr_offset <= buffer_size - 4; */ - /*@ assert offset_ptr_offset + 4 <= buffer_size; */ - /*@ assert \valid_read(buffer + (0 .. offset_ptr_offset + 4 - 1)); */ - const unsigned char *ptr_offset=&buffer[offset_ptr_offset]; - /*@ assert \valid_read(ptr_offset + (0 .. 4 - 1)); */ - const uint32_t *ptr32_offset=(const uint32_t *)ptr_offset; - /*@ assert \valid_read(ptr32_offset); */ - const unsigned int next_diroff=le32(*ptr32_offset); - if(next_diroff == 0) - return 0; - /*@ assert \valid(fr); */ - /*@ assert \valid(fr->handle); */ - /*@ assert \valid_read(&fr->extension); */ - /*@ assert valid_read_string(fr->extension); */ - return file_check_tiff_le_aux(fr, next_diroff, depth+1, count+1); - } -} - -/*@ - @ requires \valid(fr); - @ requires \valid(fr->handle); - @ requires valid_file_recovery(fr); - @ requires \valid_read(&fr->extension); - @ requires valid_read_string(fr->extension); - @ requires separation: \separated(fr, fr->handle, &errno, &Frama_C_entropy_source); - @ ensures \valid(fr); - @ ensures \valid(fr->handle); + @ requires depth <= 5; + @ decreases 5 - depth; + @ ensures valid_file_check_param(fr); @ ensures valid_read_string(fr->extension); @ assigns *fr->handle, errno; @ assigns Frama_C_entropy_source; @@ -505,8 +460,10 @@ static uint64_t file_check_tiff_le_aux(file_recovery_t *fr, const uint32_t tiff_ #endif if(depth>4) return TIFF_ERROR; + /*@ assert depth <= 4; */ if(count>16) return TIFF_ERROR; + /*@ assert count <= 16; */ if(tiff_diroff < sizeof(TIFFHeader)) return TIFF_ERROR; if(fseek(fr->handle, tiff_diroff, SEEK_SET) < 0) @@ -532,8 +489,8 @@ static uint64_t file_check_tiff_le_aux(file_recovery_t *fr, const uint32_t tiff_ X loop invariant 0 <= i <=n && i <= (data_read-2)/12; X*/ /*@ - @ loop invariant valid_file_recovery(fr); - @ loop invariant \separated(fr, fr->handle, &errno, &Frama_C_entropy_source); + @ loop invariant valid_file_check_param(fr); + @ loop invariant \separated(fr, fr->handle, fr->extension, &errno, &Frama_C_entropy_source); @ loop assigns *fr->handle, errno; @ loop assigns Frama_C_entropy_source; @ loop assigns i, sorted_tag_error, tdir_tag_old; @@ -614,15 +571,11 @@ static uint64_t file_check_tiff_le_aux(file_recovery_t *fr, const uint32_t tiff_ case TIFFTAG_EXIFIFD: case TIFFTAG_KODAKIFD: { - /*@ assert \valid(fr); */ - /*@ assert valid_file_recovery(fr); */ - /*@ assert \valid(fr->handle); */ - /*@ assert \valid_read(&fr->extension); */ + /*@ assert valid_file_check_param(fr); */ /*@ assert valid_read_string(fr->extension); */ + /*@ assert depth <= 4; */ const uint64_t new_offset=file_check_tiff_le_aux(fr, tmp, depth+1, 0); - /*@ assert \valid(fr); */ - /*@ assert \valid(fr->handle); */ - /*@ assert \valid_read(&fr->extension); */ + /*@ assert valid_file_check_param(fr); */ /*@ assert valid_read_string(fr->extension); */ if(new_offset==TIFF_ERROR) return TIFF_ERROR; @@ -639,15 +592,11 @@ static uint64_t file_check_tiff_le_aux(file_recovery_t *fr, const uint32_t tiff_ } else { - /*@ assert \valid(fr); */ - /*@ assert valid_file_recovery(fr); */ - /*@ assert \valid(fr->handle); */ - /*@ assert \valid_read(&fr->extension); */ + /*@ assert valid_file_check_param(fr); */ /*@ assert valid_read_string(fr->extension); */ + /*@ assert depth <= 4; */ const uint64_t new_offset=file_check_tiff_le_aux(fr, tmp, depth+1, 0); - /*@ assert \valid(fr); */ - /*@ assert \valid(fr->handle); */ - /*@ assert \valid_read(&fr->extension); */ + /*@ assert valid_file_check_param(fr); */ /*@ assert valid_read_string(fr->extension); */ if(new_offset==TIFF_ERROR) return TIFF_ERROR; @@ -696,8 +645,8 @@ static uint64_t file_check_tiff_le_aux(file_recovery_t *fr, const uint32_t tiff_ Frama_C_make_unknown(&subifd_offsetp_buf, sizeof(subifd_offsetp_buf)); #endif /*@ - @ loop invariant valid_file_recovery(fr); - @ loop invariant \separated(fr, fr->handle, &errno, &Frama_C_entropy_source); + @ loop invariant valid_file_check_param(fr); + @ loop invariant \separated(fr, fr->handle, fr->extension, &errno, &Frama_C_entropy_source); @ loop assigns *fr->handle, errno; @ loop assigns Frama_C_entropy_source; @ loop assigns j, max_offset; @@ -705,14 +654,11 @@ static uint64_t file_check_tiff_le_aux(file_recovery_t *fr, const uint32_t tiff_ @*/ for(j=0; j<nbr; j++) { - /*@ assert \valid(fr); */ - /*@ assert \valid(fr->handle); */ - /*@ assert \valid_read(&fr->extension); */ + /*@ assert valid_file_check_param(fr); */ /*@ assert valid_read_string(fr->extension); */ + /*@ assert depth <= 4; */ const uint64_t new_offset=file_check_tiff_le_aux(fr, le32(subifd_offsetp[j]), depth+1, 0); - /*@ assert \valid(fr); */ - /*@ assert \valid(fr->handle); */ - /*@ assert \valid_read(&fr->extension); */ + /*@ assert valid_file_check_param(fr); */ /*@ assert valid_read_string(fr->extension); */ if(new_offset==TIFF_ERROR) { @@ -767,13 +713,32 @@ static uint64_t file_check_tiff_le_aux(file_recovery_t *fr, const uint32_t tiff_ if(max_offset < tmp) max_offset=tmp; } + if(data_read < 4) + return max_offset; + /*@ assert data_read >= 4; */ { const unsigned int offset_ptr_offset=2+12*n; - const uint64_t new_offset=file_check_tiff_le_aux_next(fr, depth, count, ubuffer, data_read, offset_ptr_offset); - /*@ assert \valid(fr); */ - /*@ assert \valid(fr->handle); */ - /*@ assert \valid_read(&fr->extension); */ - /*@ assert valid_read_string(fr->extension); */ + uint64_t new_offset; + if(offset_ptr_offset > data_read-4) + return max_offset; + /*@ assert offset_ptr_offset <= data_read - 4; */ + /*@ assert offset_ptr_offset + 4 <= data_read; */ + { + /*@ assert \valid_read(ubuffer + (0 .. offset_ptr_offset + 4 - 1)); */ + const unsigned char *ptr_offset=&ubuffer[offset_ptr_offset]; + /*@ assert \valid_read(ptr_offset + (0 .. 4 - 1)); */ + const uint32_t *ptr32_offset=(const uint32_t *)ptr_offset; + /*@ assert \valid_read(ptr32_offset); */ + const unsigned int next_diroff=le32(*ptr32_offset); + if(next_diroff == 0) + return max_offset; + /*@ assert valid_file_check_param(fr); */ + /*@ assert valid_read_string(fr->extension); */ + /*@ assert depth <= 4; */ + new_offset=file_check_tiff_le_aux(fr, next_diroff, depth+1, count+1); + /*@ assert valid_file_check_param(fr); */ + /*@ assert valid_read_string(fr->extension); */ + } if(new_offset != TIFF_ERROR && max_offset < new_offset) max_offset=new_offset; } |