f2fs: fix use-after-free issue with sbi->stat_info
PATCH 1/1 f2fs: fix use-after-free issue with sbi->stat_info
iput() on sbi->node_inode can update sbi->stat_info in the below context, if the f2fs_write_checkpoint() has failed with error.
f2fs_balance_fs_bg+0x1ac/0x1ec f2fs_write_node_pages+0x4c/0x260 do_writepages+0x80/0xbc __writeback_single_inode+0xdc/0x4ac writeback_single_inode+0x9c/0x144 write_inode_now+0xc4/0xec iput+0x194/0x22c f2fs_put_super+0x11c/0x1e8 generic_shutdown_super+0x70/0xf4 kill_block_super+0x2c/0x5c kill_f2fs_super+0x44/0x50 deactivate_locked_super+0x60/0x8c deactivate_super+0x68/0x74 cleanup_mnt+0x40/0x78
Fix this by moving f2fs_destroy_stats() further below iput().
--- fs/f2fs/super.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-)
fs/f2fs/super.c +6 -3
@@ -1058,9 +1058,6 @@ static void f2fs_put_super(struct super_block *sb)f2fs_write_checkpoint (sbi, &cpc); } -/* f2fs_write_checkpoint can update stat informaion */ -f2fs_destroy_stats (sbi); -/* * normally superblock is clean, so we need to release this. * In addition, EIO will skip do checkpoint, we need this as well.
@@ -1080,6 +1077,12 @@ static void f2fs_put_super(struct super_block *sb)iput (sbi->node_inode);iput (sbi->meta_inode); +/* +* iput() can update stat information, if f2fs_write_checkpoint() +* above failed with error. +*/ +f2fs_destroy_stats (sbi); +/* destroy f2fs internal modules */ f2fs_destroy_node_manager (sbi);f2fs_destroy_segment_manager (sbi);
Signature · 2 lines
Qualcomm India Private Limited, on behalf of Qualcomm Innovation Center, Inc. Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, a Linux Foundation Collaborative Project.
Quoted 31 lines · Sahitya Tummala
iput()onsbi->node_inodecan updatesbi->stat_infoin the below context, if thef2fs_write_checkpoint()has failed with error.f2fs_balance_fs_bg+0x1ac/0x1ec f2fs_write_node_pages+0x4c/0x260 do_writepages+0x80/0xbc __writeback_single_inode+0xdc/0x4ac writeback_single_inode+0x9c/0x144 write_inode_now+0xc4/0xec iput+0x194/0x22c f2fs_put_super+0x11c/0x1e8 generic_shutdown_super+0x70/0xf4 kill_block_super+0x2c/0x5c kill_f2fs_super+0x44/0x50 deactivate_locked_super+0x60/0x8c deactivate_super+0x68/0x74 cleanup_mnt+0x40/0x78Fix this by moving
f2fs_destroy_stats()further belowiput().Signed-off-by Sahitya Tummala <[email protected]>--- fs/f2fs/super.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-)fs/f2fs/super.c +0
-0
fs/f2fs/super.c static void f2fs_put_super(struct super_block *sb) · line 1062
Quoted 5 lines
fs/f2fs/super.c +0
-2@@ -1058,9 +1058,6 @@ static void f2fs_put_super(struct super_block *sb)f2fs_write_checkpoint (sbi, &cpc); } -/* f2fs_write_checkpoint can update stat informaion */ -f2fs_destroy_stats (sbi);
The code order in error path of fill_super is almost the same as the one of put_super, could you please check that as well?
Thanks,
Quoted 18 lines
fs/f2fs/super.c +6
-1-/* * normally superblock is clean, so we need to release this. * In addition, EIO will skip do checkpoint, we need this as well. @@ -1080,6 +1077,12 @@ static void f2fs_put_super(struct super_block *sb)iput (sbi->node_inode);iput (sbi->meta_inode); +/* +* iput() can update stat information, if f2fs_write_checkpoint() +* above failed with error. +*/ +f2fs_destroy_stats (sbi); +/* destroy f2fs internal modules */ f2fs_destroy_node_manager (sbi);f2fs_destroy_segment_manager (sbi);
Quoted 35 lines · Chao Yu
Quoted 34 lines · Sahitya Tummala
iput()onsbi->node_inodecan updatesbi->stat_infoin the below context, if thef2fs_write_checkpoint()has failed with error.f2fs_balance_fs_bg+0x1ac/0x1ec f2fs_write_node_pages+0x4c/0x260 do_writepages+0x80/0xbc __writeback_single_inode+0xdc/0x4ac writeback_single_inode+0x9c/0x144 write_inode_now+0xc4/0xec iput+0x194/0x22c f2fs_put_super+0x11c/0x1e8 generic_shutdown_super+0x70/0xf4 kill_block_super+0x2c/0x5c kill_f2fs_super+0x44/0x50 deactivate_locked_super+0x60/0x8c deactivate_super+0x68/0x74 cleanup_mnt+0x40/0x78Fix this by moving
f2fs_destroy_stats()further belowiput().Signed-off-by Sahitya Tummala <[email protected]>--- fs/f2fs/super.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-)fs/f2fs/super.c +0
-0@@ -1058,9 +1058,6 @@ static void f2fs_put_super(struct super_block *sb)f2fs_write_checkpoint (sbi, &cpc); }
Quoted 6 lines
fs/f2fs/super.c static void f2fs_put_super(struct super_block *sb) · line 1062
Quoted 2 lines
fs/f2fs/super.c +0
-2-/* f2fs_write_checkpoint can update stat informaion */ -f2fs_destroy_stats (sbi);The code order in error path of
fill_superis almost the same as the one ofput_super, could you please check that as well?
Thanks Chao, for pointing it out. Yes, the same issue exists in error path of fill_super as well. I will fix it.
Quoted 21 lines
Thanks,
Quoted 18 lines
fs/f2fs/super.c +6
-1-/* * normally superblock is clean, so we need to release this. * In addition, EIO will skip do checkpoint, we need this as well. @@ -1080,6 +1077,12 @@ static void f2fs_put_super(struct super_block *sb)iput (sbi->node_inode);iput (sbi->meta_inode); +/* +* iput() can update stat information, if f2fs_write_checkpoint() +* above failed with error. +*/ +f2fs_destroy_stats (sbi); +/* destroy f2fs internal modules */ f2fs_destroy_node_manager (sbi);f2fs_destroy_segment_manager (sbi);
Signature · 3 lines
-- Sent by a consultant of the Qualcomm Innovation Center, Inc. The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum.