1From 508b1b57f73a49effc975731f8b76325d45b0e0f Mon Sep 17 00:00:00 2001 2From: zhanchengbin <zhanchengbin1@huawei.com> 3Date: Fri, 18 Mar 2022 00:02:50 +0800 4Subject: [PATCH] e2fsck: handle->level is overflow in ext2fs_extent_get. 5 6In function check_blocks_extents, program call scan_extent_node recursively until 7leaf extent is found, and if this leaf extent is the last one in this extent_idx, 8it will delete the parent extent_idx of this leaf extent in ext2fs_extent_delete, 9and do handle->level--. After scan_extent_node return, program allways to get up extent, 10but level was already decreased. 11So calling ext2fs_extent_get(EXT2_EXTENT_UP) again will return EXT2_ET_EXTENT_NO_UP, 12and then print failed. 13 14Signed-off-by: zhanchengbin <zhanchengbin1@huawei.com> 15--- 16 e2fsck/pass1.c | 7 +++++++ 17 lib/ext2fs/ext2fs.h | 1 + 18 lib/ext2fs/extent.c | 5 +++++ 19 3 files changed, 13 insertions(+) 20 21diff --git a/e2fsck/pass1.c b/e2fsck/pass1.c 22index 26b9ab71..3d698934 100644 23--- a/e2fsck/pass1.c 24+++ b/e2fsck/pass1.c 25@@ -3074,11 +3074,18 @@ report_problem: 26 } 27 } 28 } 29+ 30+ int level_bak = ext2fs_current_level_get(ehandle); 31+ 32 scan_extent_node(ctx, pctx, pb, extent.e_lblk, 33 last_lblk, eof_block, ehandle, 34 next_try_repairs); 35 if (pctx->errcode) 36 return; 37+ 38+ if (level_bak != ext2fs_current_level_get(ehandle)) 39+ return; 40+ 41 pctx->errcode = ext2fs_extent_get(ehandle, 42 EXT2_EXTENT_UP, &extent); 43 if (pctx->errcode) { 44diff --git a/lib/ext2fs/ext2fs.h b/lib/ext2fs/ext2fs.h 45index 68f9c1fe..d0468f11 100644 46--- a/lib/ext2fs/ext2fs.h 47+++ b/lib/ext2fs/ext2fs.h 48@@ -1333,6 +1333,7 @@ extern errcode_t ext2fs_extent_open2(ext2_filsys fs, ext2_ino_t ino, 49 extern void ext2fs_extent_free(ext2_extent_handle_t handle); 50 extern errcode_t ext2fs_extent_get(ext2_extent_handle_t handle, 51 int flags, struct ext2fs_extent *extent); 52+extern int ext2fs_current_level_get(ext2_extent_handle_t handle); 53 extern errcode_t ext2fs_extent_node_split(ext2_extent_handle_t handle); 54 extern errcode_t ext2fs_extent_replace(ext2_extent_handle_t handle, int flags, 55 struct ext2fs_extent *extent); 56diff --git a/lib/ext2fs/extent.c b/lib/ext2fs/extent.c 57index b324c7b0..07acd4e0 100644 58--- a/lib/ext2fs/extent.c 59+++ b/lib/ext2fs/extent.c 60@@ -575,6 +575,11 @@ retry: 61 return 0; 62 } 63 64+int ext2fs_current_level_get(ext2_extent_handle_t handle) 65+{ 66+ return handle->level; 67+} 68+ 69 static errcode_t update_path(ext2_extent_handle_t handle) 70 { 71 blk64_t blk; 72-- 732.27.0 74 75