* [PATCH 1/3] ext4: replace strcmp with direct comparison for '.' and '..'
@ 2025-07-12 18:12 Theodore Ts'o
2025-07-12 18:12 ` [PATCH 2/3] ext4: use memcpy() instead of strcpy() Theodore Ts'o
` (2 more replies)
0 siblings, 3 replies; 8+ messages in thread
From: Theodore Ts'o @ 2025-07-12 18:12 UTC (permalink / raw)
To: Ext4 Developers List; +Cc: linux-hardening, ethan, Theodore Ts'o
In a discussion over a proposed patch, "ext4: replace strcpy() with
'.' assignment"[1], I had asserted that directory entries in ext4 were
not NUL terminated, and hence it was safe to replace strcpy() with a
direct assignment. As it turns out, this was incorrect. It's true
for all all directory entries *except* for '.' and '..' where the
kernel was using strcmp() and where e2fsck actually checks and offers
to fix things if '.' and '..' are not NUL terminated.
[1] https://lore.kernel.org/r/202505191316.JJMnPobO-lkp@intel.com
We can't change this without breaking old kernel versions, but in the
spirit of "be liberal in what you receive", use direct comparison of
de->name_len and de->name[0,1] instead of strcmp(). This has the side
benefit of reducing the compiled text size by 96 bytes on x86_64.
Signed-off-by: Theodore Ts'o <tytso@mit.edu>
---
fs/ext4/namei.c | 11 +++++++----
1 file changed, 7 insertions(+), 4 deletions(-)
diff --git a/fs/ext4/namei.c b/fs/ext4/namei.c
index a178ac229489..b82f5841c65a 100644
--- a/fs/ext4/namei.c
+++ b/fs/ext4/namei.c
@@ -3082,7 +3082,8 @@ bool ext4_empty_dir(struct inode *inode)
de = (struct ext4_dir_entry_2 *) bh->b_data;
if (ext4_check_dir_entry(inode, NULL, de, bh, bh->b_data, bh->b_size,
0) ||
- le32_to_cpu(de->inode) != inode->i_ino || strcmp(".", de->name)) {
+ le32_to_cpu(de->inode) != inode->i_ino || de->name_len != 1 ||
+ de->name[0] != '.') {
ext4_warning_inode(inode, "directory missing '.'");
brelse(bh);
return false;
@@ -3091,7 +3092,8 @@ bool ext4_empty_dir(struct inode *inode)
de = ext4_next_entry(de, sb->s_blocksize);
if (ext4_check_dir_entry(inode, NULL, de, bh, bh->b_data, bh->b_size,
offset) ||
- le32_to_cpu(de->inode) == 0 || strcmp("..", de->name)) {
+ le32_to_cpu(de->inode) == 0 || de->name_len != 2 ||
+ de->name[0] != '.' || de->name[1] != '.') {
ext4_warning_inode(inode, "directory missing '..'");
brelse(bh);
return false;
@@ -3532,7 +3534,7 @@ static struct buffer_head *ext4_get_first_dir_block(handle_t *handle,
if (ext4_check_dir_entry(inode, NULL, de, bh, bh->b_data,
bh->b_size, 0) ||
le32_to_cpu(de->inode) != inode->i_ino ||
- strcmp(".", de->name)) {
+ de->name_len != 1 || de->name[0] != '.') {
EXT4_ERROR_INODE(inode, "directory missing '.'");
brelse(bh);
*retval = -EFSCORRUPTED;
@@ -3543,7 +3545,8 @@ static struct buffer_head *ext4_get_first_dir_block(handle_t *handle,
de = ext4_next_entry(de, inode->i_sb->s_blocksize);
if (ext4_check_dir_entry(inode, NULL, de, bh, bh->b_data,
bh->b_size, offset) ||
- le32_to_cpu(de->inode) == 0 || strcmp("..", de->name)) {
+ le32_to_cpu(de->inode) == 0 || de->name_len != 2 ||
+ de->name[0] != '.' || de->name[1] != '.') {
EXT4_ERROR_INODE(inode, "directory missing '..'");
brelse(bh);
*retval = -EFSCORRUPTED;
--
2.47.2
^ permalink raw reply related [flat|nested] 8+ messages in thread
* [PATCH 2/3] ext4: use memcpy() instead of strcpy()
2025-07-12 18:12 [PATCH 1/3] ext4: replace strcmp with direct comparison for '.' and '..' Theodore Ts'o
@ 2025-07-12 18:12 ` Theodore Ts'o
2025-07-30 15:02 ` Andy Shevchenko
2025-07-12 18:12 ` [PATCH 3/3] ext4: refactor the inline directory conversion and new directory codepaths Theodore Ts'o
2025-07-19 21:45 ` [PATCH 1/3] ext4: replace strcmp with direct comparison for '.' and '..' Theodore Ts'o
2 siblings, 1 reply; 8+ messages in thread
From: Theodore Ts'o @ 2025-07-12 18:12 UTC (permalink / raw)
To: Ext4 Developers List; +Cc: linux-hardening, ethan, Theodore Ts'o
The strcpy() function is considered dangerous and eeeevil by people
who are using sophisticated code analysis tools such as "grep". This
is true even when a quick inspection would show that the source is a
constant string ("." or "..") and the destination is a fixed array
which is guaranteed to have enough space. Make the "grep" code
analysis tool happy by using memcpy() isstead of strcpy(). :-)
Signed-off-by: Theodore Ts'o <tytso@mit.edu>
---
fs/ext4/inline.c | 4 ++--
fs/ext4/namei.c | 4 ++--
2 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/fs/ext4/inline.c b/fs/ext4/inline.c
index a1bbcdf40824..eeee007251e0 100644
--- a/fs/ext4/inline.c
+++ b/fs/ext4/inline.c
@@ -1315,7 +1315,7 @@ int ext4_inlinedir_to_tree(struct file *dir_file,
if (pos == 0) {
fake.inode = cpu_to_le32(inode->i_ino);
fake.name_len = 1;
- strcpy(fake.name, ".");
+ memcpy(fake.name, ".", 2);
fake.rec_len = ext4_rec_len_to_disk(
ext4_dir_rec_len(fake.name_len, NULL),
inline_size);
@@ -1325,7 +1325,7 @@ int ext4_inlinedir_to_tree(struct file *dir_file,
} else if (pos == EXT4_INLINE_DOTDOT_OFFSET) {
fake.inode = cpu_to_le32(parent_ino);
fake.name_len = 2;
- strcpy(fake.name, "..");
+ memcpy(fake.name, "..", 3);
fake.rec_len = ext4_rec_len_to_disk(
ext4_dir_rec_len(fake.name_len, NULL),
inline_size);
diff --git a/fs/ext4/namei.c b/fs/ext4/namei.c
index b82f5841c65a..9913a94b6a6d 100644
--- a/fs/ext4/namei.c
+++ b/fs/ext4/namei.c
@@ -2924,7 +2924,7 @@ struct ext4_dir_entry_2 *ext4_init_dot_dotdot(struct inode *inode,
de->name_len = 1;
de->rec_len = ext4_rec_len_to_disk(ext4_dir_rec_len(de->name_len, NULL),
blocksize);
- strcpy(de->name, ".");
+ memcpy(de->name, ".", 2);
ext4_set_de_type(inode->i_sb, de, S_IFDIR);
de = ext4_next_entry(de, blocksize);
@@ -2938,7 +2938,7 @@ struct ext4_dir_entry_2 *ext4_init_dot_dotdot(struct inode *inode,
de->rec_len = ext4_rec_len_to_disk(
ext4_dir_rec_len(de->name_len, NULL),
blocksize);
- strcpy(de->name, "..");
+ memcpy(de->name, "..", 3);
ext4_set_de_type(inode->i_sb, de, S_IFDIR);
return ext4_next_entry(de, blocksize);
--
2.47.2
^ permalink raw reply related [flat|nested] 8+ messages in thread
* [PATCH 3/3] ext4: refactor the inline directory conversion and new directory codepaths
2025-07-12 18:12 [PATCH 1/3] ext4: replace strcmp with direct comparison for '.' and '..' Theodore Ts'o
2025-07-12 18:12 ` [PATCH 2/3] ext4: use memcpy() instead of strcpy() Theodore Ts'o
@ 2025-07-12 18:12 ` Theodore Ts'o
2025-07-12 21:12 ` kernel test robot
2025-07-19 21:45 ` [PATCH 1/3] ext4: replace strcmp with direct comparison for '.' and '..' Theodore Ts'o
2 siblings, 1 reply; 8+ messages in thread
From: Theodore Ts'o @ 2025-07-12 18:12 UTC (permalink / raw)
To: Ext4 Developers List; +Cc: linux-hardening, ethan, Theodore Ts'o
There was a lot of common code in the codepaths used to convert an
inline directory and to creaet a new directory. To address this,
rename ext4_init_dot_dotdot() to ext4_init_dirblock() and then move
common code into that function.
This reduces the lines of code count in fs/ext4/inline.c and
fs/ext4/namei.c, as well as reducing the size of their object files.
Signed-off-by: Theodore Ts'o <tytso@mit.edu>
---
fs/ext4/ext4.h | 9 ++++----
fs/ext4/inline.c | 60 ++++++++++--------------------------------------
fs/ext4/namei.c | 56 ++++++++++++++++++++++++--------------------
3 files changed, 48 insertions(+), 77 deletions(-)
diff --git a/fs/ext4/ext4.h b/fs/ext4/ext4.h
index 18373de980f2..4d1d3eff2418 100644
--- a/fs/ext4/ext4.h
+++ b/fs/ext4/ext4.h
@@ -3612,6 +3612,7 @@ extern loff_t ext4_llseek(struct file *file, loff_t offset, int origin);
extern int ext4_get_max_inline_size(struct inode *inode);
extern int ext4_find_inline_data_nolock(struct inode *inode);
extern int ext4_destroy_inline_data(handle_t *handle, struct inode *inode);
+extern void ext4_update_final_de(void *de_buf, int old_size, int new_size);
int ext4_readpage_inline(struct inode *inode, struct folio *folio);
extern int ext4_try_to_write_inline_data(struct address_space *mapping,
@@ -3671,10 +3672,10 @@ static inline int ext4_has_inline_data(struct inode *inode)
extern const struct inode_operations ext4_dir_inode_operations;
extern const struct inode_operations ext4_special_inode_operations;
extern struct dentry *ext4_get_parent(struct dentry *child);
-extern struct ext4_dir_entry_2 *ext4_init_dot_dotdot(struct inode *inode,
- struct ext4_dir_entry_2 *de,
- int blocksize, int csum_size,
- unsigned int parent_ino, int dotdot_real_len);
+extern int ext4_init_dirblock(handle_t *handle, struct inode *inode,
+ struct buffer_head *dir_block,
+ unsigned int parent_ino, void *inline_buf,
+ int inline_size);
extern void ext4_initialize_dirent_tail(struct buffer_head *bh,
unsigned int blocksize);
extern int ext4_handle_dirty_dirblock(handle_t *handle, struct inode *inode,
diff --git a/fs/ext4/inline.c b/fs/ext4/inline.c
index eeee007251e0..4ad3255e45cb 100644
--- a/fs/ext4/inline.c
+++ b/fs/ext4/inline.c
@@ -995,7 +995,7 @@ static void *ext4_get_inline_xattr_pos(struct inode *inode,
}
/* Set the final de to cover the whole block. */
-static void ext4_update_final_de(void *de_buf, int old_size, int new_size)
+void ext4_update_final_de(void *de_buf, int old_size, int new_size)
{
struct ext4_dir_entry_2 *de, *prev_de;
void *limit;
@@ -1059,51 +1059,6 @@ static void ext4_restore_inline_data(handle_t *handle, struct inode *inode,
ext4_set_inode_state(inode, EXT4_STATE_MAY_INLINE_DATA);
}
-static int ext4_finish_convert_inline_dir(handle_t *handle,
- struct inode *inode,
- struct buffer_head *dir_block,
- void *buf,
- int inline_size)
-{
- int err, csum_size = 0, header_size = 0;
- struct ext4_dir_entry_2 *de;
- void *target = dir_block->b_data;
-
- /*
- * First create "." and ".." and then copy the dir information
- * back to the block.
- */
- de = target;
- de = ext4_init_dot_dotdot(inode, de,
- inode->i_sb->s_blocksize, csum_size,
- le32_to_cpu(((struct ext4_dir_entry_2 *)buf)->inode), 1);
- header_size = (void *)de - target;
-
- memcpy((void *)de, buf + EXT4_INLINE_DOTDOT_SIZE,
- inline_size - EXT4_INLINE_DOTDOT_SIZE);
-
- if (ext4_has_feature_metadata_csum(inode->i_sb))
- csum_size = sizeof(struct ext4_dir_entry_tail);
-
- inode->i_size = inode->i_sb->s_blocksize;
- i_size_write(inode, inode->i_sb->s_blocksize);
- EXT4_I(inode)->i_disksize = inode->i_sb->s_blocksize;
- ext4_update_final_de(dir_block->b_data,
- inline_size - EXT4_INLINE_DOTDOT_SIZE + header_size,
- inode->i_sb->s_blocksize - csum_size);
-
- if (csum_size)
- ext4_initialize_dirent_tail(dir_block,
- inode->i_sb->s_blocksize);
- set_buffer_uptodate(dir_block);
- unlock_buffer(dir_block);
- err = ext4_handle_dirty_dirblock(handle, inode, dir_block);
- if (err)
- return err;
- set_buffer_verified(dir_block);
- return ext4_mark_inode_dirty(handle, inode);
-}
-
static int ext4_convert_inline_data_nolock(handle_t *handle,
struct inode *inode,
struct ext4_iloc *iloc)
@@ -1175,8 +1130,17 @@ static int ext4_convert_inline_data_nolock(handle_t *handle,
error = ext4_handle_dirty_metadata(handle,
inode, data_bh);
} else {
- error = ext4_finish_convert_inline_dir(handle, inode, data_bh,
- buf, inline_size);
+ unlock_buffer(data_bh);
+ inode->i_size = inode->i_sb->s_blocksize;
+ i_size_write(inode, inode->i_sb->s_blocksize);
+ EXT4_I(inode)->i_disksize = inode->i_sb->s_blocksize;
+
+ error = ext4_init_dirblock(handle, inode, data_bh,
+ le32_to_cpu(((struct ext4_dir_entry_2 *)buf)->inode),
+ buf + EXT4_INLINE_DOTDOT_SIZE,
+ inline_size - EXT4_INLINE_DOTDOT_SIZE);
+ if (!error)
+ error = ext4_mark_inode_dirty(handle, inode);
}
out_restore:
diff --git a/fs/ext4/namei.c b/fs/ext4/namei.c
index 9913a94b6a6d..d83f91b62317 100644
--- a/fs/ext4/namei.c
+++ b/fs/ext4/namei.c
@@ -2915,11 +2915,17 @@ static int ext4_tmpfile(struct mnt_idmap *idmap, struct inode *dir,
return err;
}
-struct ext4_dir_entry_2 *ext4_init_dot_dotdot(struct inode *inode,
- struct ext4_dir_entry_2 *de,
- int blocksize, int csum_size,
- unsigned int parent_ino, int dotdot_real_len)
+int ext4_init_dirblock(handle_t *handle, struct inode *inode,
+ struct buffer_head *bh, unsigned int parent_ino,
+ void *inline_buf, int inline_size)
{
+ struct ext4_dir_entry_2 *de = (struct ext4_dir_entry_2 *) bh->b_data;
+ size_t blocksize = bh->b_size;
+ int csum_size = 0, header_size;
+
+ if (ext4_has_feature_metadata_csum(inode->i_sb))
+ csum_size = sizeof(struct ext4_dir_entry_tail);
+
de->inode = cpu_to_le32(inode->i_ino);
de->name_len = 1;
de->rec_len = ext4_rec_len_to_disk(ext4_dir_rec_len(de->name_len, NULL),
@@ -2930,18 +2936,29 @@ struct ext4_dir_entry_2 *ext4_init_dot_dotdot(struct inode *inode,
de = ext4_next_entry(de, blocksize);
de->inode = cpu_to_le32(parent_ino);
de->name_len = 2;
- if (!dotdot_real_len)
- de->rec_len = ext4_rec_len_to_disk(blocksize -
- (csum_size + ext4_dir_rec_len(1, NULL)),
- blocksize);
- else
+ memcpy(de->name, "..", 3);
+ ext4_set_de_type(inode->i_sb, de, S_IFDIR);
+ if (inline_buf) {
de->rec_len = ext4_rec_len_to_disk(
ext4_dir_rec_len(de->name_len, NULL),
blocksize);
- memcpy(de->name, "..", 3);
- ext4_set_de_type(inode->i_sb, de, S_IFDIR);
+ de = ext4_next_entry(de, blocksize);
+ header_size = (char *)de - bh->b_data;
+ memcpy((void *)de, inline_buf, inline_size);
+ ext4_update_final_de(bh->b_data, inline_size + header_size,
+ blocksize - csum_size);
+ } else {
+ de->rec_len = ext4_rec_len_to_disk(blocksize -
+ (csum_size + ext4_dir_rec_len(1, NULL)),
+ blocksize);
+ }
- return ext4_next_entry(de, blocksize);
+ if (csum_size)
+ ext4_initialize_dirent_tail(bh, blocksize);
+ BUFFER_TRACE(dir_block, "call ext4_handle_dirty_metadata");
+ set_buffer_uptodate(bh);
+ set_buffer_verified(bh);
+ return ext4_handle_dirty_dirblock(handle, inode, bh);
}
int ext4_init_new_dir(handle_t *handle, struct inode *dir,
@@ -2950,13 +2967,8 @@ int ext4_init_new_dir(handle_t *handle, struct inode *dir,
struct buffer_head *dir_block = NULL;
struct ext4_dir_entry_2 *de;
ext4_lblk_t block = 0;
- unsigned int blocksize = dir->i_sb->s_blocksize;
- int csum_size = 0;
int err;
- if (ext4_has_feature_metadata_csum(dir->i_sb))
- csum_size = sizeof(struct ext4_dir_entry_tail);
-
if (ext4_test_inode_state(inode, EXT4_STATE_MAY_INLINE_DATA)) {
err = ext4_try_create_inline_dir(handle, dir, inode);
if (err < 0 && err != -ENOSPC)
@@ -2965,21 +2977,15 @@ int ext4_init_new_dir(handle_t *handle, struct inode *dir,
goto out;
}
+ set_nlink(inode, 2);
inode->i_size = 0;
dir_block = ext4_append(handle, inode, &block);
if (IS_ERR(dir_block))
return PTR_ERR(dir_block);
de = (struct ext4_dir_entry_2 *)dir_block->b_data;
- ext4_init_dot_dotdot(inode, de, blocksize, csum_size, dir->i_ino, 0);
- set_nlink(inode, 2);
- if (csum_size)
- ext4_initialize_dirent_tail(dir_block, blocksize);
-
- BUFFER_TRACE(dir_block, "call ext4_handle_dirty_metadata");
- err = ext4_handle_dirty_dirblock(handle, inode, dir_block);
+ err = ext4_init_dirblock(handle, inode, dir_block, dir->i_ino, NULL, 0);
if (err)
goto out;
- set_buffer_verified(dir_block);
out:
brelse(dir_block);
return err;
--
2.47.2
^ permalink raw reply related [flat|nested] 8+ messages in thread
* Re: [PATCH 3/3] ext4: refactor the inline directory conversion and new directory codepaths
2025-07-12 18:12 ` [PATCH 3/3] ext4: refactor the inline directory conversion and new directory codepaths Theodore Ts'o
@ 2025-07-12 21:12 ` kernel test robot
2025-07-21 23:15 ` Eric Biggers
0 siblings, 1 reply; 8+ messages in thread
From: kernel test robot @ 2025-07-12 21:12 UTC (permalink / raw)
To: Theodore Ts'o, Ext4 Developers List
Cc: oe-kbuild-all, linux-hardening, ethan, Theodore Ts'o
Hi Theodore,
kernel test robot noticed the following build warnings:
[auto build test WARNING on tytso-ext4/dev]
[also build test WARNING on linus/master v6.16-rc5 next-20250711]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]
url: https://github.com/intel-lab-lkp/linux/commits/Theodore-Ts-o/ext4-use-memcpy-instead-of-strcpy/20250713-021635
base: https://git.kernel.org/pub/scm/linux/kernel/git/tytso/ext4.git dev
patch link: https://lore.kernel.org/r/20250712181249.434530-3-tytso%40mit.edu
patch subject: [PATCH 3/3] ext4: refactor the inline directory conversion and new directory codepaths
config: i386-buildonly-randconfig-004-20250713 (https://download.01.org/0day-ci/archive/20250713/202507130429.rPIzofCD-lkp@intel.com/config)
compiler: gcc-12 (Debian 12.2.0-14+deb12u1) 12.2.0
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20250713/202507130429.rPIzofCD-lkp@intel.com/reproduce)
If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202507130429.rPIzofCD-lkp@intel.com/
All warnings (new ones prefixed by >>):
fs/ext4/namei.c: In function 'ext4_init_new_dir':
>> fs/ext4/namei.c:2968:34: warning: variable 'de' set but not used [-Wunused-but-set-variable]
2968 | struct ext4_dir_entry_2 *de;
| ^~
vim +/de +2968 fs/ext4/namei.c
a774f9c20e0864 Tao Ma 2012-12-10 2963
8016e29f4362e2 Harshad Shirwadkar 2020-10-15 2964 int ext4_init_new_dir(handle_t *handle, struct inode *dir,
a774f9c20e0864 Tao Ma 2012-12-10 2965 struct inode *inode)
ac27a0ec112a08 Dave Kleikamp 2006-10-11 2966 {
dabd991f9d8e32 Namhyung Kim 2011-01-10 2967 struct buffer_head *dir_block = NULL;
617ba13b31fbf5 Mingming Cao 2006-10-11 @2968 struct ext4_dir_entry_2 *de;
dc6982ff4db1f4 Theodore Ts'o 2013-02-14 2969 ext4_lblk_t block = 0;
a774f9c20e0864 Tao Ma 2012-12-10 2970 int err;
ac27a0ec112a08 Dave Kleikamp 2006-10-11 2971
3c47d54170b6a6 Tao Ma 2012-12-10 2972 if (ext4_test_inode_state(inode, EXT4_STATE_MAY_INLINE_DATA)) {
3c47d54170b6a6 Tao Ma 2012-12-10 2973 err = ext4_try_create_inline_dir(handle, dir, inode);
3c47d54170b6a6 Tao Ma 2012-12-10 2974 if (err < 0 && err != -ENOSPC)
3c47d54170b6a6 Tao Ma 2012-12-10 2975 goto out;
3c47d54170b6a6 Tao Ma 2012-12-10 2976 if (!err)
3c47d54170b6a6 Tao Ma 2012-12-10 2977 goto out;
3c47d54170b6a6 Tao Ma 2012-12-10 2978 }
3c47d54170b6a6 Tao Ma 2012-12-10 2979
5eb8361f6b02c3 Theodore Ts'o 2025-07-12 2980 set_nlink(inode, 2);
dc6982ff4db1f4 Theodore Ts'o 2013-02-14 2981 inode->i_size = 0;
0f70b40613ee14 Theodore Ts'o 2013-02-15 2982 dir_block = ext4_append(handle, inode, &block);
0f70b40613ee14 Theodore Ts'o 2013-02-15 2983 if (IS_ERR(dir_block))
0f70b40613ee14 Theodore Ts'o 2013-02-15 2984 return PTR_ERR(dir_block);
a774f9c20e0864 Tao Ma 2012-12-10 2985 de = (struct ext4_dir_entry_2 *)dir_block->b_data;
5eb8361f6b02c3 Theodore Ts'o 2025-07-12 2986 err = ext4_init_dirblock(handle, inode, dir_block, dir->i_ino, NULL, 0);
a774f9c20e0864 Tao Ma 2012-12-10 2987 if (err)
a774f9c20e0864 Tao Ma 2012-12-10 2988 goto out;
a774f9c20e0864 Tao Ma 2012-12-10 2989 out:
a774f9c20e0864 Tao Ma 2012-12-10 2990 brelse(dir_block);
a774f9c20e0864 Tao Ma 2012-12-10 2991 return err;
a774f9c20e0864 Tao Ma 2012-12-10 2992 }
a774f9c20e0864 Tao Ma 2012-12-10 2993
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH 1/3] ext4: replace strcmp with direct comparison for '.' and '..'
2025-07-12 18:12 [PATCH 1/3] ext4: replace strcmp with direct comparison for '.' and '..' Theodore Ts'o
2025-07-12 18:12 ` [PATCH 2/3] ext4: use memcpy() instead of strcpy() Theodore Ts'o
2025-07-12 18:12 ` [PATCH 3/3] ext4: refactor the inline directory conversion and new directory codepaths Theodore Ts'o
@ 2025-07-19 21:45 ` Theodore Ts'o
2 siblings, 0 replies; 8+ messages in thread
From: Theodore Ts'o @ 2025-07-19 21:45 UTC (permalink / raw)
To: Ext4 Developers List, Theodore Ts'o; +Cc: linux-hardening, ethan
On Sat, 12 Jul 2025 14:12:47 -0400, Theodore Ts'o wrote:
> In a discussion over a proposed patch, "ext4: replace strcpy() with
> '.' assignment"[1], I had asserted that directory entries in ext4 were
> not NUL terminated, and hence it was safe to replace strcpy() with a
> direct assignment. As it turns out, this was incorrect. It's true
> for all all directory entries *except* for '.' and '..' where the
> kernel was using strcmp() and where e2fsck actually checks and offers
> to fix things if '.' and '..' are not NUL terminated.
>
> [...]
Applied, thanks!
[1/3] ext4: replace strcmp with direct comparison for '.' and '..'
commit: 3658b8b3398eb2a49ee8d1ac88e5cdc41764f1c9
[2/3] ext4: use memcpy() instead of strcpy()
commit: a35454ecf8a320c49954fdcdae0e8d3323067632
[3/3] ext4: refactor the inline directory conversion and new directory codepaths
commit: 90f097b1403f232a202c501bfd49b1b196e840ea
Best regards,
--
Theodore Ts'o <tytso@mit.edu>
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH 3/3] ext4: refactor the inline directory conversion and new directory codepaths
2025-07-12 21:12 ` kernel test robot
@ 2025-07-21 23:15 ` Eric Biggers
2025-07-30 15:01 ` Andy Shevchenko
0 siblings, 1 reply; 8+ messages in thread
From: Eric Biggers @ 2025-07-21 23:15 UTC (permalink / raw)
To: Theodore Ts'o
Cc: kernel test robot, Ext4 Developers List, oe-kbuild-all,
linux-hardening, ethan
Hi Ted,
On Sun, Jul 13, 2025 at 05:12:55AM +0800, kernel test robot wrote:
> All warnings (new ones prefixed by >>):
>
> fs/ext4/namei.c: In function 'ext4_init_new_dir':
> >> fs/ext4/namei.c:2968:34: warning: variable 'de' set but not used [-Wunused-but-set-variable]
> 2968 | struct ext4_dir_entry_2 *de;
> | ^~
This warning is present in ext4/dev now.
- Eric
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH 3/3] ext4: refactor the inline directory conversion and new directory codepaths
2025-07-21 23:15 ` Eric Biggers
@ 2025-07-30 15:01 ` Andy Shevchenko
0 siblings, 0 replies; 8+ messages in thread
From: Andy Shevchenko @ 2025-07-30 15:01 UTC (permalink / raw)
To: Eric Biggers
Cc: Theodore Ts'o, kernel test robot, Ext4 Developers List,
oe-kbuild-all, linux-hardening, ethan
On Mon, Jul 21, 2025 at 04:15:59PM -0700, Eric Biggers wrote:
> On Sun, Jul 13, 2025 at 05:12:55AM +0800, kernel test robot wrote:
> > All warnings (new ones prefixed by >>):
> >
> > fs/ext4/namei.c: In function 'ext4_init_new_dir':
> > >> fs/ext4/namei.c:2968:34: warning: variable 'de' set but not used [-Wunused-but-set-variable]
> > 2968 | struct ext4_dir_entry_2 *de;
> > | ^~
>
> This warning is present in ext4/dev now.
For somebody (who doesn't alter CONFIG_WERROR) this is a build breakage with both GCC and clang.
--
With Best Regards,
Andy Shevchenko
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH 2/3] ext4: use memcpy() instead of strcpy()
2025-07-12 18:12 ` [PATCH 2/3] ext4: use memcpy() instead of strcpy() Theodore Ts'o
@ 2025-07-30 15:02 ` Andy Shevchenko
0 siblings, 0 replies; 8+ messages in thread
From: Andy Shevchenko @ 2025-07-30 15:02 UTC (permalink / raw)
To: Theodore Ts'o; +Cc: Ext4 Developers List, linux-hardening, ethan
On Sat, Jul 12, 2025 at 02:12:48PM -0400, Theodore Ts'o wrote:
> The strcpy() function is considered dangerous and eeeevil by people
> who are using sophisticated code analysis tools such as "grep". This
> is true even when a quick inspection would show that the source is a
> constant string ("." or "..") and the destination is a fixed array
> which is guaranteed to have enough space. Make the "grep" code
> analysis tool happy by using memcpy() isstead of strcpy(). :-)
Why simple 2-arg strscpy() can't be used?
...
> - strcpy(fake.name, ".");
> + memcpy(fake.name, ".", 2);
s/strcpy/strscpy/
--
With Best Regards,
Andy Shevchenko
^ permalink raw reply [flat|nested] 8+ messages in thread
end of thread, other threads:[~2025-07-30 14:02 UTC | newest]
Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-07-12 18:12 [PATCH 1/3] ext4: replace strcmp with direct comparison for '.' and '..' Theodore Ts'o
2025-07-12 18:12 ` [PATCH 2/3] ext4: use memcpy() instead of strcpy() Theodore Ts'o
2025-07-30 15:02 ` Andy Shevchenko
2025-07-12 18:12 ` [PATCH 3/3] ext4: refactor the inline directory conversion and new directory codepaths Theodore Ts'o
2025-07-12 21:12 ` kernel test robot
2025-07-21 23:15 ` Eric Biggers
2025-07-30 15:01 ` Andy Shevchenko
2025-07-19 21:45 ` [PATCH 1/3] ext4: replace strcmp with direct comparison for '.' and '..' Theodore Ts'o
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).