@ @ requires 8 <= size <= 1024*1024; @ requires offset <= 1024*1024; @ requires \valid_read(buffer+ (0 .. size-1)); @ requires \initialized(buffer+ (0 .. size-1)); @ requires \valid(ext); @ requires *ext == \null || valid_read_string(*ext); @ ensures *ext == \null || valid_read_string(*ext); @ assigns *ext; @*/
| 954 | @ assigns *ext; |
| 955 | @*/ |
| 956 | static void OLE_parse_software_entry(const char *buffer, const unsigned int size, const unsigned int offset, const char **ext) |
| 957 | { |
| 958 | if(offset >= size - 8) |
| 959 | { |
| 960 | /*@ assert *ext == \null || valid_read_string(*ext); */ |
| 961 | return ; |
| 962 | } |
| 963 | /*@ assert offset < size - 8; */ |
| 964 | { |
| 965 | const unsigned int count=get32u(buffer, offset + 4); |
| 966 | const unsigned int offset_soft=offset + 8; |
| 967 | /*@ assert offset_soft == offset + 8; */ |
| 968 | if(count == 0 || count > size) |
| 969 | { |
| 970 | /*@ assert *ext == \null || valid_read_string(*ext); */ |
| 971 | return ; |
| 972 | } |
| 973 | /*@ assert 0 < count <= size; */ |
| 974 | if(offset_soft + count > size) |
| 975 | { |
| 976 | /*@ assert *ext == \null || valid_read_string(*ext); */ |
| 977 | return ; |
| 978 | } |
| 979 | /*@ assert offset_soft + count <= size; */ |
| 980 | /*@ assert \valid_read(buffer + (0 .. size-1)); */ |
| 981 | /*@ assert \forall int j; (0 <= j < size ) ==> \valid_read(buffer + j + (0 .. size-1-j)); */ |
| 982 | /*@ assert 0 <= offset_soft < size; */ |
| 983 | /*@ assert \valid_read(buffer + offset_soft + (0 .. size - offset_soft -1)); */ |
| 984 | /*@ assert 0 < count <= size - offset_soft; */ |
| 985 | /*@ assert \valid_read(buffer + offset_soft + (0 .. count -1)); */ |
| 986 | |
| 987 | /*@ assert offset_soft + count <= size; */ |
| 988 | /*@ assert count <= size - offset_soft; */ |
| 989 | /*@ assert \valid_read(buffer + (0 .. size-1)); */ |
| 990 | /*@ assert \valid_read(buffer + (0 .. offset_soft + count -1)); */ |
| 991 | #ifdef DEBUG_OLE |
| 992 | { |
| 993 | unsigned int j; |
| 994 | log_info("Software "); |
| 995 | for(j=0; j<count; j++) |
| 996 | { |
| 997 | /*@ assert 0 <= j < count; */ |
| 998 | /*@ assert offset_soft + count <= size; */ |
| 999 | const unsigned int tmp=offset_soft+j; |
| 1000 | /*@ assert tmp < size; */ |
| 1001 | log_info("%c", buffer[tmp]); |
| 1002 | } |
| 1003 | log_info("\n"); |
| 1004 | } |
| 1005 | #endif |
| 1006 | software2ext(ext, &buffer[offset_soft], count); |
| 1007 | /*@ assert *ext == \null || valid_read_string(*ext); */ |
| 1008 | } |
| 1009 | /*@ assert *ext == \null || valid_read_string(*ext); */ |
| 1010 | } |
| 1011 | |
| 1012 | /*@ |
| 1013 | @ requires 8 <= size <= 1024*1024; |
no test coverage detected