@ @ 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; @*/
| 883 | @ assigns *fr->handle, fr->file_size, errno, Frama_C_entropy_source; |
| 884 | @*/ |
| 885 | static 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); |
no test coverage detected