From 24a219e5ce6559b861a4dfc686241151daee83f0 Mon Sep 17 00:00:00 2001 From: Eric Kim Date: Thu, 6 Aug 2026 17:31:26 +0900 Subject: [PATCH] Replace strncpy() usage with strscpy() helpers It has been discouraged in linux kernel to use strncpy() as it had been a persistent source of bugs due to its ambiguous intent and counter-intuitive semantics. And because of that, it was removed from linux kernel 7.2. Replace strncpy() with strscpy() for null termination and strscpy_pad() for null terminations with padding which provides more safer string copying semantics and guarantees null termination when destination buffer is non-empty. --- inode.c | 18 +++++++----------- super.c | 2 +- 2 files changed, 8 insertions(+), 12 deletions(-) diff --git a/inode.c b/inode.c index cef4922..dacc95f 100644 --- a/inode.c +++ b/inode.c @@ -111,7 +111,7 @@ struct inode *simplefs_iget(struct super_block *sb, unsigned long ino) inode->i_fop = &simplefs_file_ops; inode->i_mapping->a_ops = &simplefs_aops; } else if (S_ISLNK(inode->i_mode)) { - strncpy(ci->i_data, cinode->i_data, sizeof(ci->i_data)); + strscpy(ci->i_data, cinode->i_data, sizeof(ci->i_data)); inode->i_link = ci->i_data; inode->i_op = &symlink_inode_ops; } @@ -448,18 +448,15 @@ static void simplefs_set_file_into_dir(struct simplefs_dir_block *dblock, } dblock->files[fi + 1].inode = inode_no; dblock->files[fi + 1].nr_blk = dblock->files[fi].nr_blk - 1; - strncpy(dblock->files[fi + 1].filename, name, - SIMPLEFS_FILENAME_LEN - 1); - dblock->files[fi + 1].filename[SIMPLEFS_FILENAME_LEN - 1] = '\0'; + strscpy_pad(dblock->files[fi + 1].filename, name, + SIMPLEFS_FILENAME_LEN); dblock->files[fi].nr_blk = 1; } else if (dblock->nr_files == 0) { dblock->files[0].inode = inode_no; - strncpy(dblock->files[0].filename, name, SIMPLEFS_FILENAME_LEN - 1); - dblock->files[0].filename[SIMPLEFS_FILENAME_LEN - 1] = '\0'; + strscpy(dblock->files[0].filename, name, SIMPLEFS_FILENAME_LEN); } else { dblock->files[0].inode = inode_no; - strncpy(dblock->files[0].filename, name, SIMPLEFS_FILENAME_LEN - 1); - dblock->files[0].filename[SIMPLEFS_FILENAME_LEN - 1] = '\0'; + strscpy_pad(dblock->files[0].filename, name, SIMPLEFS_FILENAME_LEN); } dblock->nr_files++; } @@ -932,9 +929,8 @@ static int simplefs_rename(struct inode *src_dir, dblock = (struct simplefs_dir_block *) src_bi_bh->b_data; - strncpy(dblock->files[fi].filename, dest_dentry->d_name.name, - SIMPLEFS_FILENAME_LEN - 1); - dblock->files[fi].filename[SIMPLEFS_FILENAME_LEN - 1] = '\0'; + strscpy_pad(dblock->files[fi].filename, dest_dentry->d_name.name, + SIMPLEFS_FILENAME_LEN); mark_buffer_dirty(src_bi_bh); RELEASE_BUFFER_HEAD(src_bi_bh); diff --git a/super.c b/super.c index 1d54983..7308d21 100644 --- a/super.c +++ b/super.c @@ -108,7 +108,7 @@ static int simplefs_write_inode(struct inode *inode, disk_inode->i_blocks = inode->i_blocks; disk_inode->i_nlink = inode->i_nlink; disk_inode->ei_block = ci->ei_block; - strncpy(disk_inode->i_data, ci->i_data, sizeof(ci->i_data)); + strscpy(disk_inode->i_data, ci->i_data, sizeof(ci->i_data)); mark_buffer_dirty(bh); sync_dirty_buffer(bh);