From: Theodore Ts'o Date: Mon, 2 Jun 2008 02:56:37 +0000 (-0400) Subject: ext2fs_extent_replace: Support uninit extents and check validity of e_len X-Git-Tag: v1.41-WIP-0617~38 X-Git-Url: https://git.whamcloud.com/?a=commitdiff_plain;h=05a32de263228ce8f78746143384e5ebe2677d14;p=tools%2Fe2fsprogs.git ext2fs_extent_replace: Support uninit extents and check validity of e_len Signed-off-by: "Theodore Ts'o" --- diff --git a/lib/ext2fs/ext2_err.et.in b/lib/ext2fs/ext2_err.et.in index 9047a8f..d72bbd2 100644 --- a/lib/ext2fs/ext2_err.et.in +++ b/lib/ext2fs/ext2_err.et.in @@ -407,4 +407,7 @@ ec EXT2_ET_EXTENT_NOT_FOUND, ec EXT2_ET_EXTENT_NOT_SUPPORTED, "Operation not supported for inodes containing extents" +ec EXT2_ET_EXTENT_INVALID_LENGTH, + "Extent length is invalid" + end diff --git a/lib/ext2fs/extent.c b/lib/ext2fs/extent.c index b76abdc..b669e29 100644 --- a/lib/ext2fs/extent.c +++ b/lib/ext2fs/extent.c @@ -663,7 +663,16 @@ errcode_t ext2fs_extent_replace(ext2_extent_handle_t handle, ex->ee_block = ext2fs_cpu_to_le32(extent->e_lblk); ex->ee_start = ext2fs_cpu_to_le32(extent->e_pblk & 0xFFFFFFFF); ex->ee_start_hi = ext2fs_cpu_to_le16(extent->e_pblk >> 32); - ex->ee_len = ext2fs_cpu_to_le16(extent->e_len); + if (extent->e_flags & EXT2_EXTENT_FLAGS_UNINIT) { + if (extent->e_len > EXT_UNINIT_MAX_LEN) + return EXT2_ET_EXTENT_INVALID_LENGTH; + ex->ee_len = ext2fs_cpu_to_le16(extent->e_len + + EXT_INIT_MAX_LEN); + } else { + if (extent->e_len > EXT_INIT_MAX_LEN) + return EXT2_ET_EXTENT_INVALID_LENGTH; + ex->ee_len = ext2fs_cpu_to_le16(extent->e_len); + } } else { ix = path->curr; @@ -970,6 +979,14 @@ void do_replace_node(int argc, char *argv[]) if (check_fs_read_write(argv[0])) return; + extent.e_flags = 0; + + if (!strcmp(argv[1], "--uninit")) { + argc--; + argv++; + extent.e_flags |= EXT2_EXTENT_FLAGS_UNINIT; + } + if (argc != 4) { fprintf(stderr, "usage: %s \n", argv[0]); return; @@ -1011,10 +1028,22 @@ void do_insert_node(int argc, char *argv[]) cmd = argv[0]; - if (argc > 2 && !strcmp(argv[1], "--after")) { - argc--; - argv++; - flags |= EXT2_EXTENT_INSERT_AFTER; + extent.e_flags = 0; + + while (argc > 2) { + if (!strcmp(argv[1], "--after")) { + argc--; + argv++; + flags |= EXT2_EXTENT_INSERT_AFTER; + continue; + } + if (!strcmp(argv[1], "--uninit")) { + argc--; + argv++; + extent.e_flags |= EXT2_EXTENT_FLAGS_UNINIT; + continue; + } + break; } if (argc != 4) {