summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/file_hdf5.c96
1 files changed, 22 insertions, 74 deletions
diff --git a/src/file_hdf5.c b/src/file_hdf5.c
index 5e476313..cc78a691 100644
--- a/src/file_hdf5.c
+++ b/src/file_hdf5.c
@@ -19,7 +19,6 @@
Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
-
#if !defined(SINGLE_FORMAT) || defined(SINGLE_FORMAT_hdf5)
#ifdef HAVE_CONFIG_H
#include <config.h>
@@ -63,72 +62,6 @@ struct hdf5_superblock
} __attribute__ ((gcc_struct, __packed__));
/*@
- @ requires \separated(file_recovery, file_recovery->handle, &errno, &Frama_C_entropy_source, &__fc_heap_status);
- @ requires valid_file_check_param(file_recovery);
- @ ensures valid_file_check_result(file_recovery);
- @*/
-static void file_check_hdf5_0(file_recovery_t *file_recovery)
-{
- const uint8_t eof_address_offset = 0x18 + 2*8;
- FILE *handle = file_recovery->handle;
- uint64_t eof_address = 0;
- /* Get EOF Address */
- if (my_fseek(handle, eof_address_offset, SEEK_SET) < 0 ||
- fread(&eof_address, sizeof(eof_address), 1, handle) != 1)
- {
-#ifdef DEBUG_HDF5
- log_error("file_check_hdf5_0: Couldn't read HDF End of File Address");
-#endif
- file_recovery->file_size=0;
- return;
- }
- eof_address = le64(eof_address);
-#ifdef DEBUG_HDF5
- log_info("file_check_hdf5_0: dec eof_address = %lu\n", (long unsigned)eof_address);
- log_info("file_check_hdf5_0: hex eof_address = 0x%02lX\n", eof_address);
-#endif
- if(eof_address < eof_address_offset || eof_address < file_recovery->file_size)
- {
- file_recovery->file_size=0;
- return;
- }
- file_recovery->file_size=eof_address;
-}
-
-/*@
- @ requires \separated(file_recovery, file_recovery->handle, &errno, &Frama_C_entropy_source, &__fc_heap_status);
- @ requires valid_file_check_param(file_recovery);
- @ ensures valid_file_check_result(file_recovery);
- @*/
-static void file_check_hdf5_1(file_recovery_t *file_recovery)
-{
- const uint8_t eof_address_offset = 0x1C + 2*0x8;
- FILE *handle = file_recovery->handle;
- uint64_t eof_address = 0;
- /* Get EOF Address */
- if (my_fseek(handle, eof_address_offset, SEEK_SET) < 0 ||
- fread(&eof_address, sizeof(eof_address), 1, handle) != 1)
- {
-#ifdef DEBUG_HDF5
- log_error("file_check_hdf5_1: Couldn't read HDF End of File Address");
-#endif
- file_recovery->file_size=0;
- return;
- }
- eof_address = le64(eof_address);
-#ifdef DEBUG_HDF5
- log_info("file_check_hdf5_1: dec eof_address = %lu\n", (long unsigned)eof_address);
- log_info("file_check_hdf5_1: hex eof_address = 0x%02lX\n", eof_address);
-#endif
- if(eof_address < eof_address_offset || eof_address < file_recovery->file_size)
- {
- file_recovery->file_size=0;
- return;
- }
- file_recovery->file_size=eof_address;
-}
-
-/*@
@ requires buffer_size >= sizeof(struct hdf5_superblock);
@ requires separation: \separated(&file_hint_hdf5, buffer+(..), file_recovery, file_recovery_new);
@ requires valid_header_check_param(buffer, buffer_size, safe_header_only, file_recovery, file_recovery_new);
@@ -141,15 +74,30 @@ static int header_check_hdf5(const unsigned char *buffer, const unsigned int buf
/*@ assert \valid_read(sb); */
if(sb->version > 2)
return 0;
+ if(sb->offsets_size < 1)
+ return 0;
+ if(sb->offsets_size == 8)
+ {
+ uint64_t calculated_file_size;
+ /* Currently only handle 64-bits offsets */
+ if(sb->version == 0)
+ calculated_file_size = le64(*(const uint64_t *)(&buffer[0x18 + 2*8]));
+ else
+ calculated_file_size = le64(*(const uint64_t *)(&buffer[0x1C + 2*8]));
+ if(calculated_file_size < 0x1C + 3*8)
+ return 0;
+ reset_file_recovery(file_recovery_new);
+ file_recovery_new->extension=file_hint_hdf5.extension;
+ file_recovery_new->calculated_file_size = calculated_file_size;
+#ifdef DEBUG_HDF5
+ log_info("calculated_file_size %llu\n", (long long unsigned)calculated_file_size);
+#endif
+ file_recovery_new->data_check=&data_check_size;
+ file_recovery_new->file_check=&file_check_size;
+ return 1;
+ }
reset_file_recovery(file_recovery_new);
file_recovery_new->extension=file_hint_hdf5.extension;
- if(sb->offsets_size != 8)
- return 1;
- /* Currently only handle 64-bits offsets */
- if(sb->version == 0)
- file_recovery_new->file_check=&file_check_hdf5_0;
- else
- file_recovery_new->file_check=&file_check_hdf5_1;
return 1;
}