2.5 [5 of 8] 05-corrupt_items_checks.diff
PATCH 1/1 2.5 [5 of 8] 05-corrupt_items_checks.diff
Hello!
Do not panic when encountered item of unknown type, just print a warning.
include/linux/reiserfs_fs.h renamed from include/linux/reiserfs_fs.h.orig +11 -12
@@ -337,7 +337,15 @@#define REISERFS_VALID_FS 1#define REISERFS_ERROR_FS 2 - +// +// there are 5 item types currently +// +#define TYPE_STAT_DATA 0 +#define TYPE_INDIRECT 1 +#define TYPE_DIRECT 2 +#define TYPE_DIRENTRY 3 +#define TYPE_MAXTYPE 3 +#define TYPE_ANY 15 // FIXME: comment is required/***************************************************************************/ /* KEY & ITEM HEAD */
@@ -373,7 +381,7 @@ {offset_v2_esafe_overlay tmp = *(const offset_v2_esafe_overlay *)v2; tmp.linear =le64_to_cpu ( tmp.linear ); -return tmp.offset_v2.k_type; +return (tmp.offset_v2.k_type <=TYPE_MAXTYPE )?tmp.offset_v2.k_type:TYPE_ANY ; }static inline void set_offset_v2_k_type (struct offset_v2 *v2,int type )
@@ -523,15 +531,6 @@#define put_block_num (p, i, v) put_unaligned(cpu_to_le32(v), (p) + (i))// -// there are 5 item types currently -// -#define TYPE_STAT_DATA 0 -#define TYPE_INDIRECT 1 -#define TYPE_DIRECT 2 -#define TYPE_DIRENTRY 3 -#define TYPE_ANY 15 // FIXME: comment is required - -// // in old version uniqueness field shows key type // #define V1_SD_UNIQUENESS 0
@@ -1498,7 +1497,7 @@extern struct item_operations stat_data_ops, indirect_ops, direct_ops, direntry_ops; -extern struct item_operations * item_ops [4 ]; +extern struct item_operations * item_ops [TYPE_ANY +1 ];#define op_bytes_number (ih,bsize) item_ops[le_ih_k_type (ih)]->bytes_number (ih, bsize)#define op_is_left_mergeable (key,bsize) item_ops[le_key_k_type (le_key_version (key), key)]->is_left_mergeable (key, bsize)
fs/reiserfs/stree.c renamed from fs/reiserfs/stree.c.orig +4 -0
@@ -524,6 +524,10 @@ ih = (struct item_head *)(buf +BLKH_SIZE ); prev_location = blocksize;for (i =0 ; i < nr; i ++, ih ++) { +if (le_ih_k_type (ih) ==TYPE_ANY ) { +reiserfs_warning ("is_leaf: wrong item type for item %h\n" ,ih); +return 0 ; + }if (ih_location (ih) >= blocksize ||ih_location (ih) <IH_SIZE * nr) {reiserfs_warning ("is_leaf: item location seems wrong: %h\n" , ih);return 0 ;
fs/reiserfs/item_ops.c renamed from fs/reiserfs/item_ops.c.orig +95 -2
112 lines not on this page · raw message