From a9c51552d87182ae2f29907ca299814f2a3d7878 Mon Sep 17 00:00:00 2001 From: hifi521 <1067551775@qq.com> Date: Sat, 21 May 2022 06:07:15 +0000 Subject: [PATCH] e2fsck: handle->level is overflow in ext2fs_extent_get. Fix issue: https://gitee.com/src-openeuler/e2fsprogs/issues/I4Z2KL (cherry picked from commit 05fdf1b676c0fcd85b06da02b0d4a08ff1953b93) --- ...vel-is-overflow-in-ext2fs_extent_get.patch | 74 +++++++++++++++++++ e2fsprogs.spec | 6 +- 2 files changed, 79 insertions(+), 1 deletion(-) create mode 100644 0042-e2fsck-handle-level-is-overflow-in-ext2fs_extent_get.patch diff --git a/0042-e2fsck-handle-level-is-overflow-in-ext2fs_extent_get.patch b/0042-e2fsck-handle-level-is-overflow-in-ext2fs_extent_get.patch new file mode 100644 index 0000000..2ee5d1d --- /dev/null +++ b/0042-e2fsck-handle-level-is-overflow-in-ext2fs_extent_get.patch @@ -0,0 +1,74 @@ +From 508b1b57f73a49effc975731f8b76325d45b0e0f Mon Sep 17 00:00:00 2001 +From: zhanchengbin +Date: Fri, 18 Mar 2022 00:02:50 +0800 +Subject: [PATCH] e2fsck: handle->level is overflow in ext2fs_extent_get. + +In function check_blocks_extents, program call scan_extent_node recursively until +leaf extent is found, and if this leaf extent is the last one in this extent_idx, +it will delete the parent extent_idx of this leaf extent in ext2fs_extent_delete, +and do handle->level--. After scan_extent_node return, program allways to get up extent, +but level was already decreased. +So calling ext2fs_extent_get(EXT2_EXTENT_UP) again will return EXT2_ET_EXTENT_NO_UP, +and then print failed. + +Signed-off-by: zhanchengbin +--- + e2fsck/pass1.c | 7 +++++++ + lib/ext2fs/ext2fs.h | 1 + + lib/ext2fs/extent.c | 5 +++++ + 3 files changed, 13 insertions(+) + +diff --git a/e2fsck/pass1.c b/e2fsck/pass1.c +index 26b9ab71..3d698934 100644 +--- a/e2fsck/pass1.c ++++ b/e2fsck/pass1.c +@@ -3074,11 +3074,18 @@ report_problem: + } + } + } ++ ++ int level_bak = ext2fs_current_level_get(ehandle); ++ + scan_extent_node(ctx, pctx, pb, extent.e_lblk, + last_lblk, eof_block, ehandle, + next_try_repairs); + if (pctx->errcode) + return; ++ ++ if (level_bak != ext2fs_current_level_get(ehandle)) ++ return; ++ + pctx->errcode = ext2fs_extent_get(ehandle, + EXT2_EXTENT_UP, &extent); + if (pctx->errcode) { +diff --git a/lib/ext2fs/ext2fs.h b/lib/ext2fs/ext2fs.h +index 68f9c1fe..d0468f11 100644 +--- a/lib/ext2fs/ext2fs.h ++++ b/lib/ext2fs/ext2fs.h +@@ -1333,6 +1333,7 @@ extern errcode_t ext2fs_extent_open2(ext2_filsys fs, ext2_ino_t ino, + extern void ext2fs_extent_free(ext2_extent_handle_t handle); + extern errcode_t ext2fs_extent_get(ext2_extent_handle_t handle, + int flags, struct ext2fs_extent *extent); ++extern int ext2fs_current_level_get(ext2_extent_handle_t handle); + extern errcode_t ext2fs_extent_node_split(ext2_extent_handle_t handle); + extern errcode_t ext2fs_extent_replace(ext2_extent_handle_t handle, int flags, + struct ext2fs_extent *extent); +diff --git a/lib/ext2fs/extent.c b/lib/ext2fs/extent.c +index b324c7b0..07acd4e0 100644 +--- a/lib/ext2fs/extent.c ++++ b/lib/ext2fs/extent.c +@@ -575,6 +575,11 @@ retry: + return 0; + } + ++int ext2fs_current_level_get(ext2_extent_handle_t handle) ++{ ++ return handle->level; ++} ++ + static errcode_t update_path(ext2_extent_handle_t handle) + { + blk64_t blk; +-- +2.27.0 + diff --git a/e2fsprogs.spec b/e2fsprogs.spec index faeb483..73dda7d 100644 --- a/e2fsprogs.spec +++ b/e2fsprogs.spec @@ -1,6 +1,6 @@ Name: e2fsprogs Version: 1.45.6 -Release: 9 +Release: 10 Summary: Second extended file system management tools License: GPLv2 and LGPLv2 and GPLv2+ URL: http://e2fsprogs.sourceforge.net/ @@ -48,6 +48,7 @@ Patch38: 0038-e2fsck-exit-journal-recovery-when-find-EIO-ENOMEM-er.patch Patch39: 0039-e2fsck-exit-journal-recovery-when-jounral-superblock.patch Patch40: 0040-e2fsck-add-env-param-E2FS_UNRELIABLE_IO-to-fi.patch Patch41: 0041-e2fsck-do-not-clean-up-file-acl-if-the-inode-is-trun.patch +Patch42: 0042-e2fsck-handle-level-is-overflow-in-ext2fs_extent_get.patch BuildRequires: gcc pkgconfig texinfo BuildRequires: fuse-devel libblkid-devel libuuid-devel @@ -169,6 +170,9 @@ exit 0 %{_mandir}/man8/* %changelog +* Fri May 21 2022 zhanchengbin - 1.45.6-10 +- e2fsck: handle->level is overflow in ext2fs_extent_get. + * Fri May 20 2022 zhanchengbin - 1.45.6-9 - e2fsck: do not clean up file acl if the inode is truncating type -- Gitee