From 1aa974054274a4f59dfa59c88bb9a85461eca113 Mon Sep 17 00:00:00 2001 From: rajeshvenkataraman Date: Sun, 23 Sep 2018 07:49:30 -0700 Subject: [PATCH] ext4_dir: fix non existing entry creation issue Added the length of the name string a a parameter. Using strlen() on the name string may not give the correct length in case of paths like: /mountpoint/nonexistdir1/nonexistdir2. --- include/ext4_dir_idx.h | 2 +- src/ext4_dir.c | 2 +- src/ext4_dir_idx.c | 3 +-- 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/include/ext4_dir_idx.h b/include/ext4_dir_idx.h index 74d896ba..f1c5b26d 100644 --- a/include/ext4_dir_idx.h +++ b/include/ext4_dir_idx.h @@ -91,7 +91,7 @@ int ext4_dir_dx_find_entry(struct ext4_dir_search_result *result, * @return Error code */ int ext4_dir_dx_add_entry(struct ext4_inode_ref *parent, - struct ext4_inode_ref *child, const char *name); + struct ext4_inode_ref *child, const char *name, uint32_t name_len); /**@brief Add new entry to indexed directory * @param dir Directory i-node diff --git a/src/ext4_dir.c b/src/ext4_dir.c index b11d6c29..29a51c5e 100644 --- a/src/ext4_dir.c +++ b/src/ext4_dir.c @@ -351,7 +351,7 @@ int ext4_dir_add_entry(struct ext4_inode_ref *parent, const char *name, /* Index adding (if allowed) */ if ((ext4_sb_feature_com(sb, EXT4_FCOM_DIR_INDEX)) && (ext4_inode_has_flag(parent->inode, EXT4_INODE_FLAG_INDEX))) { - r = ext4_dir_dx_add_entry(parent, child, name); + r = ext4_dir_dx_add_entry(parent, child, name, name_len); /* Check if index is not corrupted */ if (r != EXT4_ERR_BAD_DX_DIR) { diff --git a/src/ext4_dir_idx.c b/src/ext4_dir_idx.c index b56e9fe0..f7a64dd3 100644 --- a/src/ext4_dir_idx.c +++ b/src/ext4_dir_idx.c @@ -1230,7 +1230,7 @@ ext4_dir_dx_split_index(struct ext4_inode_ref *ino_ref, } int ext4_dir_dx_add_entry(struct ext4_inode_ref *parent, - struct ext4_inode_ref *child, const char *name) + struct ext4_inode_ref *child, const char *name, uint32_t name_len) { int rc2 = EOK; int r; @@ -1257,7 +1257,6 @@ int ext4_dir_dx_add_entry(struct ext4_inode_ref *parent, } /* Initialize hinfo structure (mainly compute hash) */ - uint32_t name_len = strlen(name); struct ext4_hash_info hinfo; r = ext4_dir_hinfo_init(&hinfo, &root_blk, &fs->sb, name_len, name); if (r != EOK) {