@ @ 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; @*/
| 926 | @ assigns *fr->handle, fr->file_size, errno, Frama_C_entropy_source; |
| 927 | @*/ |
| 928 | static int zip_parse_data_desc(file_recovery_t *fr) |
| 929 | { |
| 930 | char buffer[sizeof(struct zip_desc)]; |
| 931 | const struct zip_desc *desc=(const struct zip_desc *)&buffer; |
| 932 | if (fread(&buffer, sizeof(buffer), 1, fr->handle) != 1) |
| 933 | { |
| 934 | #ifdef DEBUG_ZIP |
| 935 | log_trace("zip: Unexpected EOF reading header of data_desc\n"); |
| 936 | #endif |
| 937 | return -1; |
| 938 | } |
| 939 | #if defined(__FRAMAC__) |
| 940 | Frama_C_make_unknown(buffer, sizeof(buffer)); |
| 941 | #endif |
| 942 | fr->file_size += sizeof(struct zip_desc); |
| 943 | #ifdef DEBUG_ZIP |
| 944 | log_info("compressed_size=%u/%lu uncompressed_size=%u CRC32=0x%08X\n", |
| 945 | le32(desc->compressed_size), |
| 946 | expected_compressed_size, |
| 947 | le32(desc->uncompressed_size), |
| 948 | le32(desc->crc32)); |
| 949 | #endif |
| 950 | if(le32(desc->compressed_size)!=expected_compressed_size) |
| 951 | return -1; |
| 952 | return 0; |
| 953 | } |
| 954 | |
| 955 | /*@ |
| 956 | @ requires \valid(fr); |
no outgoing calls
no test coverage detected