MCPcopy Create free account
hub / github.com/cgsecurity/testdisk / data_check_aux

Function data_check_aux

src/fidentify.c:106–181  ·  view source on GitHub ↗

@ @ requires \valid(file_recovery); @ requires valid_file_recovery(file_recovery); @ requires \valid_function(file_recovery->data_check); @ requires 0 < blocksize <= READ_SIZE; @ requires READ_SIZE % blocksize == 0; @ requires \valid(buffer_start + (0 .. blocksize + READ_SIZE -1)); @ requires \separated(file_recovery, &errno, buffer_start + (..)); @ decreases 0; @ ensures valid_

Source from the content-addressed store, hash-verified

104 @ assigns file_recovery->data_check, file_recovery->file_check, file_recovery->offset_error, file_recovery->offset_ok, file_recovery->time, file_recovery->data_check_tmp;
105 @*/
106static data_check_t data_check_aux(file_recovery_t *file_recovery, const unsigned int blocksize, char *buffer_start)
107{
108 /*@ ghost const unsigned int buffer_size=blocksize + READ_SIZE; */
109 /*@
110 @ loop invariant valid_file_recovery(file_recovery);
111 @ loop invariant file_recovery == \at(file_recovery, Pre);
112 @ loop invariant \valid_read(buffer_start + (0 .. blocksize + READ_SIZE - 1));
113 @ loop invariant file_recovery->calculated_file_size < PHOTOREC_MAX_FILE_SIZE;
114 @ loop invariant file_recovery->file_size < PHOTOREC_MAX_FILE_SIZE;
115 @ loop invariant \valid_function(file_recovery->data_check);
116 @ loop invariant \separated(file_recovery, &errno, buffer_start + (..));
117 @ loop assigns *file_recovery->handle, errno;
118 @ loop assigns buffer_start[0 .. blocksize + READ_SIZE -1];
119 @ loop assigns file_recovery->file_size;
120 @ loop assigns file_recovery->calculated_file_size, file_recovery->data_check_tmp;
121 @ loop assigns file_recovery->data_check, file_recovery->file_check, file_recovery->offset_error, file_recovery->offset_ok, file_recovery->time, file_recovery->data_check_tmp;
122 @*/
123 while(1)
124 {
125 char *buffer=buffer_start+blocksize;
126 unsigned int i;
127 size_t lu=0;
128 /*@ assert valid_file_recovery(file_recovery); */
129 memset(buffer, 0, READ_SIZE);
130 lu=fread(buffer, 1, READ_SIZE, file_recovery->handle);
131 if(lu <= 0)
132 {
133 /*@ assert valid_file_recovery(file_recovery); */
134 return DC_STOP;
135 }
136 /*@ assert 0 < lu <= READ_SIZE; */
137 /*@
138 @ loop invariant valid_file_recovery(file_recovery);
139 @ loop invariant file_recovery == \at(file_recovery, Pre);
140 @ loop invariant \valid_read(buffer_start + (0 .. blocksize + READ_SIZE - 1));
141 @ loop invariant file_recovery->calculated_file_size < PHOTOREC_MAX_FILE_SIZE;
142 @ loop invariant file_recovery->file_size < PHOTOREC_MAX_FILE_SIZE;
143 @ loop invariant \valid_function(file_recovery->data_check);
144 @ loop invariant \separated(file_recovery, &errno, buffer_start + (..));
145 @ loop assigns i, file_recovery->file_size;
146 @ loop assigns file_recovery->calculated_file_size, file_recovery->data_check_tmp;
147 @ loop assigns file_recovery->data_check, file_recovery->file_check, file_recovery->offset_error, file_recovery->offset_ok, file_recovery->time, file_recovery->data_check_tmp;
148 @ loop variant lu - i;
149 @*/
150 for(i=0; i<lu; i+=blocksize)
151 {
152 /*@ assert i + 2*blocksize <= buffer_size; */
153 /*@ assert \valid_read(&buffer_start[i] + (0 .. 2*blocksize-1)); */
154 const data_check_t res=data_check_wrapper((const unsigned char *) &buffer_start[i], 2*blocksize, file_recovery);
155 /*@ assert valid_data_check_result(res, file_recovery); */
156 /*@ assert \valid_read(&buffer_start[i] + (0 .. 2*blocksize-1)); */
157 file_recovery->file_size+=blocksize;
158 if(res != DC_CONTINUE || file_recovery->data_check==NULL)
159 {
160 /*@ assert valid_file_recovery(file_recovery); */
161 return res;
162 }
163 if( file_recovery->calculated_file_size >= PHOTOREC_MAX_FILE_SIZE ||

Callers 1

data_checkFunction · 0.85

Calls 1

data_check_wrapperFunction · 0.85

Tested by

no test coverage detected