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

Function zip_parse_end_central_dir

src/file_zip.c:885–918  ·  view source on GitHub ↗

@ @ requires \valid(fr); @ requires \valid(fr->handle); @ requires fr->file_size < 0x8000000000000000; @ requires \separated(fr, fr->handle, &errno, &Frama_C_entropy_source); @ ensures \result == -1 || \result == 0; @ assigns *fr->handle, fr->file_size, errno, Frama_C_entropy_source; @*/

Source from the content-addressed store, hash-verified

883 @ assigns *fr->handle, fr->file_size, errno, Frama_C_entropy_source;
884 @*/
885static int zip_parse_end_central_dir(file_recovery_t *fr)
886{
887 char buffer[sizeof(struct zip_end_central_dir)];
888 const struct zip_end_central_dir *dir=(const struct zip_end_central_dir *)&buffer;
889
890 if (fread(&buffer, sizeof(struct zip_end_central_dir), 1, fr->handle) != 1)
891 {
892#ifdef DEBUG_ZIP
893 log_trace("zip: Unexpected EOF reading header of zip_parse_end_central_dir\n");
894#endif
895 return -1;
896 }
897#if defined(__FRAMAC__)
898 Frama_C_make_unknown(buffer, sizeof(struct zip_end_central_dir));
899#endif
900 fr->file_size += sizeof(struct zip_end_central_dir);
901
902 if (dir->comment_length)
903 {
904 const uint16_t len = le16(dir->comment_length);
905 if (my_fseek(fr->handle, len, SEEK_CUR) == -1)
906 {
907#ifdef DEBUG_ZIP
908 log_trace("zip: Unexpected EOF in end_central_dir: expected %u bytes\n", len);
909#endif
910 return -1;
911 }
912 fr->file_size += len;
913#ifdef DEBUG_ZIP
914 log_trace("zip: Comment of length %u\n", len);
915#endif
916 }
917 return 0;
918}
919
920/*@
921 @ requires \valid(fr);

Callers 2

file_check_zipFunction · 0.85
file_rename_zipFunction · 0.85

Calls 1

my_fseekFunction · 0.85

Tested by

no test coverage detected