Patch "f2fs: do more integrity verification for superblock" has been added to the 3.18-stable tree
Subsystems (2)
This is a note to let you know that I've just added the patch titled
f2fs: do more integrity verification for superblock
to the 3.18-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
f2fs-do-more-integrity-verification-for-superblock.patch
and it can be found in the queue-3.18 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From
9a59b62fd88196844cee5fff851bee2cfd7afb6eMon Sep 17 00:00:00 2001
From: Chao Yu <[email protected]>
Date: Tue, 15 Dec 2015 09:58:18 +0800
Subject: f2fs: do more integrity verification for superblock
From: Chao Yu <[email protected]>
commit 9a59b62fd88196844cee5fff851bee2cfd7afb6e upstream.
Do more sanity check for superblock during ->mount.
--- fs/f2fs/super.c | 98 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 98 insertions(+)
fs/f2fs/super.c +98 -0
@@ -772,6 +772,79 @@ static loff_t max_file_size(unsigned bitreturn result; } +static inline bool sanity_check_area_boundary (struct super_block *sb, +struct f2fs_super_block *raw_super) +{ +u32 segment0_blkaddr =le32_to_cpu (raw_super->segment0_blkaddr); +u32 cp_blkaddr =le32_to_cpu (raw_super->cp_blkaddr); +u32 sit_blkaddr =le32_to_cpu (raw_super->sit_blkaddr); +u32 nat_blkaddr =le32_to_cpu (raw_super->nat_blkaddr); +u32 ssa_blkaddr =le32_to_cpu (raw_super->ssa_blkaddr); +u32 main_blkaddr =le32_to_cpu (raw_super->main_blkaddr); +u32 segment_count_ckpt =le32_to_cpu (raw_super->segment_count_ckpt); +u32 segment_count_sit =le32_to_cpu (raw_super->segment_count_sit); +u32 segment_count_nat =le32_to_cpu (raw_super->segment_count_nat); +u32 segment_count_ssa =le32_to_cpu (raw_super->segment_count_ssa); +u32 segment_count_main =le32_to_cpu (raw_super->segment_count_main); +u32 segment_count =le32_to_cpu (raw_super->segment_count); +u32 log_blocks_per_seg =le32_to_cpu (raw_super->log_blocks_per_seg); + +if (segment0_blkaddr != cp_blkaddr) { +f2fs_msg (sb,KERN_INFO , +"Mismatch start address, segment0(%u) cp_blkaddr(%u)" , + segment0_blkaddr, cp_blkaddr); +return true; + } + +if (cp_blkaddr + (segment_count_ckpt << log_blocks_per_seg) != + sit_blkaddr) { +f2fs_msg (sb,KERN_INFO , +"Wrong CP boundary, start(%u) end(%u) blocks(%u)" , + cp_blkaddr, sit_blkaddr, + segment_count_ckpt << log_blocks_per_seg); +return true; + } + +if (sit_blkaddr + (segment_count_sit << log_blocks_per_seg) != + nat_blkaddr) { +f2fs_msg (sb,KERN_INFO , +"Wrong SIT boundary, start(%u) end(%u) blocks(%u)" , + sit_blkaddr, nat_blkaddr, + segment_count_sit << log_blocks_per_seg); +return true; + } + +if (nat_blkaddr + (segment_count_nat << log_blocks_per_seg) != + ssa_blkaddr) { +f2fs_msg (sb,KERN_INFO , +"Wrong NAT boundary, start(%u) end(%u) blocks(%u)" , + nat_blkaddr, ssa_blkaddr, + segment_count_nat << log_blocks_per_seg); +return true; + } + +if (ssa_blkaddr + (segment_count_ssa << log_blocks_per_seg) != + main_blkaddr) { +f2fs_msg (sb,KERN_INFO , +"Wrong SSA boundary, start(%u) end(%u) blocks(%u)" , + ssa_blkaddr, main_blkaddr, + segment_count_ssa << log_blocks_per_seg); +return true; + } + +if (main_blkaddr + (segment_count_main << log_blocks_per_seg) != + segment0_blkaddr + (segment_count << log_blocks_per_seg)) { +f2fs_msg (sb,KERN_INFO , +"Wrong MAIN_AREA boundary, start(%u) end(%u) blocks(%u)" , + main_blkaddr, + segment0_blkaddr + (segment_count << log_blocks_per_seg), + segment_count_main << log_blocks_per_seg); +return true; + } + +return false; +} +static int sanity_check_raw_super (struct super_block *sb,struct f2fs_super_block *raw_super) {
@@ -801,6 +874,14 @@ static int sanity_check_raw_super(structreturn 1 ; } +/* check log blocks per segment */ +if (le32_to_cpu (raw_super->log_blocks_per_seg) !=9 ) { +f2fs_msg (sb,KERN_INFO , +"Invalid log blocks per segment (%u)\n" , +le32_to_cpu (raw_super->log_blocks_per_seg)); +return 1 ; + } +/* Currently, support 512/1024/2048/4096 bytes sector size */ if (le32_to_cpu(raw_super->log_sectorsize) > F2FS_MAX_LOG_SECTOR_SIZE ||
@@ -819,6 +900,23 @@ static int sanity_check_raw_super(struct le32_to_cpu(raw_super->log_sectorsize));return 1 ; } + +/* check reserved ino info */ +if (le32_to_cpu (raw_super->node_ino) !=1 || +le32_to_cpu (raw_super->meta_ino) !=2 || +le32_to_cpu (raw_super->root_ino) !=3 ) { +f2fs_msg (sb,KERN_INFO , +"Invalid Fs Meta Ino: node(%u) meta(%u) root(%u)" , +le32_to_cpu (raw_super->node_ino), +le32_to_cpu (raw_super->meta_ino), +le32_to_cpu (raw_super->root_ino)); +return 1 ; + } + +/* check CP/SIT/NAT/SSA/MAIN_AREA area boundary */ +if (sanity_check_area_boundary (sb, raw_super)) +return 1 ; +return 0 ; }
Patches currently in stable-queue which might be from [email protected] are
queue-3.18/f2fs-do-more-integrity-verification-for-superblock.patch