uint8_t rawDataGet32(const RawData *raw_data, const uint32_t offset, uint32_t *data) { if(offset + sizeof(uint32_t) <= raw_data->cur_size) { uint32_t num; memcpy(&num, raw_data->buffer + offset, sizeof(uint32_t)); (*data) = gdb_ntoh_uint32(num); return RAW_FILE_SUCC; } return RAW_FILE_FAIL; }
uint8_t gdbGetFreeBlockList(GDatabase *db, GdbFreeBlock **blocks, uint32_t *count) { GdbFreeBlock *blockList; uint32_t listSize; uint8_t *buffer; size_t s; uint32_t i, counter = 0; offset_t __offset; if (blocks == NULL || count == NULL) { return 0; } *blocks = NULL; /* Seek to the start of the block list. */ rawFileSeek(db->idxRawFile, DB_FREE_BLOCK_LIST_OFFSET, SEEK_SET); __offset = DB_FREE_BLOCK_LIST_OFFSET; if (rawFileRead(db->idxRawFile, __offset, &db->freeBlockCount, sizeof(uint32_t), 1, LOC_DB_0001) != 1) { db->freeBlockCount = 0; } else { __offset += sizeof(uint32_t); } db->freeBlockCount = gdb_ntoh_uint32(db->freeBlockCount); *count = db->freeBlockCount; if (db->freeBlockCount == 0) { return 0; } /* Get the total size of the free blocks list. */ listSize = db->freeBlockCount * (sizeof(uint16_t) + sizeof(offset_t)); /* Allocate the buffer. */ MEM_CHECK(buffer = (uint8_t *)SAFE_MALLOC(listSize, LOC_DB_0002)); /* Read in the list. */ //rawFileSeek(db->idxRawFile, DB_FREE_BLOCK_LIST_OFFSET + sizeof(uint32_t), SEEK_SET); if ((s = rawFileRead(db->idxRawFile, __offset, buffer, 1, listSize, LOC_DB_0003)) != listSize) { dbg_log(SEC_0131_DB, 0)(LOGSTDOUT,"error:gdbGetFreeBlockList: Truncated block list.\n" "Expected %d bytes, got %d bytes. Block list offset = %d\n" "Free block count = %d. Filename = %s\n", listSize, s, DB_FREE_BLOCK_LIST_OFFSET, db->freeBlockCount, db->filename); abort(); } MEM_CHECK(blockList = (GdbFreeBlock *)SAFE_MALLOC(db->freeBlockCount * sizeof(GdbFreeBlock), LOC_DB_0004)); for (i = 0; i < db->freeBlockCount; i++) { blockList[i].size = gdbGet16(buffer, &counter); blockList[i].offset = gdbGetOffset(buffer, &counter); } *blocks = blockList; SAFE_FREE(buffer, LOC_DB_0005); return 1; }