static void dump_path(const char *tag, struct ext2_extent_handle *handle, struct extent_path *path) { struct extent_path *ppp = path; printf("%s: level=%d\n", tag, handle->level); do { printf("%s: path=%ld buf=%p entries=%d max_entries=%d left=%d " "visit_num=%d flags=0x%x end_blk=%llu curr=%p(%ld)\n", tag, (ppp - handle->path), ppp->buf, ppp->entries, ppp->max_entries, ppp->left, ppp->visit_num, ppp->flags, ppp->end_blk, ppp->curr, ppp->curr - (void *)ppp->buf); printf(" "); dbg_show_header((struct ext3_extent_header *)ppp->buf); if (ppp->curr) { printf(" "); dbg_show_index(ppp->curr); printf(" "); dbg_show_extent(ppp->curr); } ppp--; } while (ppp >= handle->path); fflush(stdout); return; }
errcode_t ext2fs_extent_header_verify(void *ptr, int size) { int eh_max, entry_size; struct ext3_extent_header *eh = ptr; dbg_show_header(eh); if (ext2fs_le16_to_cpu(eh->eh_magic) != EXT3_EXT_MAGIC) return EXT2_ET_EXTENT_HEADER_BAD; if (ext2fs_le16_to_cpu(eh->eh_entries) > ext2fs_le16_to_cpu(eh->eh_max)) return EXT2_ET_EXTENT_HEADER_BAD; if (eh->eh_depth == 0) entry_size = sizeof(struct ext3_extent); else entry_size = sizeof(struct ext3_extent_idx); eh_max = (size - sizeof(*eh)) / entry_size; if ((ext2fs_le16_to_cpu(eh->eh_max) > eh_max) || (ext2fs_le16_to_cpu(eh->eh_max) < (eh_max - 2))) return EXT2_ET_EXTENT_HEADER_BAD; return 0; }
/* * Verify the extent header as being sane */ errcode_t ext2fs_extent_header_verify(void *ptr, int size) { int eh_max, entry_size; struct ext3_extent_header *eh = ptr; dbg_show_header(eh); if (ext2fs_le16_to_cpu(eh->eh_magic) != EXT3_EXT_MAGIC) return EXT2_ET_EXTENT_HEADER_BAD; if (ext2fs_le16_to_cpu(eh->eh_entries) > ext2fs_le16_to_cpu(eh->eh_max)) return EXT2_ET_EXTENT_HEADER_BAD; if (eh->eh_depth == 0) entry_size = sizeof(struct ext3_extent); else entry_size = sizeof(struct ext3_extent_idx); eh_max = (size - sizeof(*eh)) / entry_size; /* Allow two extent-sized items at the end of the block, for * ext4_extent_tail with checksum in the future. */ if ((ext2fs_le16_to_cpu(eh->eh_max) > eh_max) || (ext2fs_le16_to_cpu(eh->eh_max) < (eh_max - 2))) return EXT2_ET_EXTENT_HEADER_BAD; return 0; }