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

Function OLE_parse_software_entry

src/file_doc.c:956–1010  ·  view source on GitHub ↗

@ @ 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; @*/

Source from the content-addressed store, hash-verified

954 @ assigns *ext;
955 @*/
956static 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;

Callers 1

Calls 2

get32uFunction · 0.85
software2extFunction · 0.85

Tested by

no test coverage detected