* [PATCH] ubifs: prefer kstrtobool_from_user() over custom helper @ 2026-04-02 8:13 Dmitry Antipov 2026-04-02 11:18 ` Zhihao Cheng 0 siblings, 1 reply; 12+ messages in thread From: Dmitry Antipov @ 2026-04-02 8:13 UTC (permalink / raw) To: Richard Weinberger; +Cc: Zhihao Cheng, linux-mtd, Dmitry Antipov Adjust 'dfs_file_write()' and 'dfs_global_file_write()' to prefer generic 'kstrtobool_from_user()' over an ad-hoc 'interpret_user_input()' helper, thus making the latter not needed anymore. Signed-off-by: Dmitry Antipov <dmantipov@yandex.ru> --- fs/ubifs/debug.c | 44 ++++++++++---------------------------------- 1 file changed, 10 insertions(+), 34 deletions(-) diff --git a/fs/ubifs/debug.c b/fs/ubifs/debug.c index 160c16aa7b6e..252cf82012cf 100644 --- a/fs/ubifs/debug.c +++ b/fs/ubifs/debug.c @@ -2732,39 +2732,14 @@ static ssize_t dfs_file_read(struct file *file, char __user *u, size_t count, return provide_user_output(val, u, count, ppos); } -/** - * interpret_user_input - interpret user debugfs file input. - * @u: user-provided buffer with the input - * @count: buffer size - * - * This is a helper function which interpret user input to a boolean UBIFS - * debugfs file. Returns %0 or %1 in case of success and a negative error code - * in case of failure. - */ -static int interpret_user_input(const char __user *u, size_t count) -{ - size_t buf_size; - char buf[8]; - - buf_size = min_t(size_t, count, (sizeof(buf) - 1)); - if (copy_from_user(buf, u, buf_size)) - return -EFAULT; - - if (buf[0] == '1') - return 1; - else if (buf[0] == '0') - return 0; - - return -EINVAL; -} - static ssize_t dfs_file_write(struct file *file, const char __user *u, size_t count, loff_t *ppos) { struct ubifs_info *c = file->private_data; struct ubifs_debug_info *d = c->dbg; struct dentry *dent = file->f_path.dentry; - int val; + bool val; + int ret; if (file->f_path.dentry == d->dfs_dump_lprops) { ubifs_dump_lprops(c); @@ -2781,9 +2756,9 @@ static ssize_t dfs_file_write(struct file *file, const char __user *u, return count; } - val = interpret_user_input(u, count); - if (val < 0) - return val; + ret = kstrtobool_from_user(u, count, &val); + if (unlikely(ret)) + return ret; if (dent == d->dfs_chk_gen) d->chk_gen = val; @@ -2926,11 +2901,12 @@ static ssize_t dfs_global_file_write(struct file *file, const char __user *u, size_t count, loff_t *ppos) { struct dentry *dent = file->f_path.dentry; - int val; + bool val; + int ret; - val = interpret_user_input(u, count); - if (val < 0) - return val; + ret = kstrtobool_from_user(u, count, &val); + if (unlikely(ret)) + return ret; if (dent == dfs_chk_gen) ubifs_dbg.chk_gen = val; -- 2.53.0 ______________________________________________________ Linux MTD discussion mailing list http://lists.infradead.org/mailman/listinfo/linux-mtd/ ^ permalink raw reply related [flat|nested] 12+ messages in thread
* Re: [PATCH] ubifs: prefer kstrtobool_from_user() over custom helper 2026-04-02 8:13 [PATCH] ubifs: prefer kstrtobool_from_user() over custom helper Dmitry Antipov @ 2026-04-02 11:18 ` Zhihao Cheng 2026-04-03 16:37 ` [PATCH v2 1/2] " Dmitry Antipov 0 siblings, 1 reply; 12+ messages in thread From: Zhihao Cheng @ 2026-04-02 11:18 UTC (permalink / raw) To: Dmitry Antipov, Richard Weinberger; +Cc: linux-mtd 在 2026/4/2 16:13, Dmitry Antipov 写道: > Adjust 'dfs_file_write()' and 'dfs_global_file_write()' to prefer generic > 'kstrtobool_from_user()' over an ad-hoc 'interpret_user_input()' helper, > thus making the latter not needed anymore. > > Signed-off-by: Dmitry Antipov <dmantipov@yandex.ru> > --- > fs/ubifs/debug.c | 44 ++++++++++---------------------------------- > 1 file changed, 10 insertions(+), 34 deletions(-) > Reviewed-by: Zhihao Cheng <chengzhihao1@huawei.com> > diff --git a/fs/ubifs/debug.c b/fs/ubifs/debug.c > index 160c16aa7b6e..252cf82012cf 100644 > --- a/fs/ubifs/debug.c > +++ b/fs/ubifs/debug.c > @@ -2732,39 +2732,14 @@ static ssize_t dfs_file_read(struct file *file, char __user *u, size_t count, > return provide_user_output(val, u, count, ppos); > } > > -/** > - * interpret_user_input - interpret user debugfs file input. > - * @u: user-provided buffer with the input > - * @count: buffer size > - * > - * This is a helper function which interpret user input to a boolean UBIFS > - * debugfs file. Returns %0 or %1 in case of success and a negative error code > - * in case of failure. > - */ > -static int interpret_user_input(const char __user *u, size_t count) > -{ > - size_t buf_size; > - char buf[8]; > - > - buf_size = min_t(size_t, count, (sizeof(buf) - 1)); > - if (copy_from_user(buf, u, buf_size)) > - return -EFAULT; > - > - if (buf[0] == '1') > - return 1; > - else if (buf[0] == '0') > - return 0; > - > - return -EINVAL; > -} > - > static ssize_t dfs_file_write(struct file *file, const char __user *u, > size_t count, loff_t *ppos) > { > struct ubifs_info *c = file->private_data; > struct ubifs_debug_info *d = c->dbg; > struct dentry *dent = file->f_path.dentry; > - int val; > + bool val; > + int ret; > > if (file->f_path.dentry == d->dfs_dump_lprops) { > ubifs_dump_lprops(c); > @@ -2781,9 +2756,9 @@ static ssize_t dfs_file_write(struct file *file, const char __user *u, > return count; > } > > - val = interpret_user_input(u, count); > - if (val < 0) > - return val; > + ret = kstrtobool_from_user(u, count, &val); > + if (unlikely(ret)) > + return ret; > > if (dent == d->dfs_chk_gen) > d->chk_gen = val; > @@ -2926,11 +2901,12 @@ static ssize_t dfs_global_file_write(struct file *file, const char __user *u, > size_t count, loff_t *ppos) > { > struct dentry *dent = file->f_path.dentry; > - int val; > + bool val; > + int ret; > > - val = interpret_user_input(u, count); > - if (val < 0) > - return val; > + ret = kstrtobool_from_user(u, count, &val); > + if (unlikely(ret)) > + return ret; > > if (dent == dfs_chk_gen) > ubifs_dbg.chk_gen = val; > ______________________________________________________ Linux MTD discussion mailing list http://lists.infradead.org/mailman/listinfo/linux-mtd/ ^ permalink raw reply [flat|nested] 12+ messages in thread
* [PATCH v2 1/2] ubifs: prefer kstrtobool_from_user() over custom helper 2026-04-02 11:18 ` Zhihao Cheng @ 2026-04-03 16:37 ` Dmitry Antipov 2026-04-03 16:37 ` [PATCH v2 2/2] ubifs: use strscpy() and kmemdup_nul() where appropriate Dmitry Antipov 0 siblings, 1 reply; 12+ messages in thread From: Dmitry Antipov @ 2026-04-03 16:37 UTC (permalink / raw) To: Zhihao Cheng; +Cc: Richard Weinberger, linux-mtd, Dmitry Antipov Adjust 'dfs_file_write()' and 'dfs_global_file_write()' to prefer generic 'kstrtobool_from_user()' over an ad-hoc 'interpret_user_input()' helper, thus making the latter not needed anymore. Reviewed-by: Zhihao Cheng <chengzhihao1@huawei.com> Signed-off-by: Dmitry Antipov <dmantipov@yandex.ru> --- v2: add Reviewed-by: and bump version to match the series --- fs/ubifs/debug.c | 44 ++++++++++---------------------------------- 1 file changed, 10 insertions(+), 34 deletions(-) diff --git a/fs/ubifs/debug.c b/fs/ubifs/debug.c index 160c16aa7b6e..252cf82012cf 100644 --- a/fs/ubifs/debug.c +++ b/fs/ubifs/debug.c @@ -2732,39 +2732,14 @@ static ssize_t dfs_file_read(struct file *file, char __user *u, size_t count, return provide_user_output(val, u, count, ppos); } -/** - * interpret_user_input - interpret user debugfs file input. - * @u: user-provided buffer with the input - * @count: buffer size - * - * This is a helper function which interpret user input to a boolean UBIFS - * debugfs file. Returns %0 or %1 in case of success and a negative error code - * in case of failure. - */ -static int interpret_user_input(const char __user *u, size_t count) -{ - size_t buf_size; - char buf[8]; - - buf_size = min_t(size_t, count, (sizeof(buf) - 1)); - if (copy_from_user(buf, u, buf_size)) - return -EFAULT; - - if (buf[0] == '1') - return 1; - else if (buf[0] == '0') - return 0; - - return -EINVAL; -} - static ssize_t dfs_file_write(struct file *file, const char __user *u, size_t count, loff_t *ppos) { struct ubifs_info *c = file->private_data; struct ubifs_debug_info *d = c->dbg; struct dentry *dent = file->f_path.dentry; - int val; + bool val; + int ret; if (file->f_path.dentry == d->dfs_dump_lprops) { ubifs_dump_lprops(c); @@ -2781,9 +2756,9 @@ static ssize_t dfs_file_write(struct file *file, const char __user *u, return count; } - val = interpret_user_input(u, count); - if (val < 0) - return val; + ret = kstrtobool_from_user(u, count, &val); + if (unlikely(ret)) + return ret; if (dent == d->dfs_chk_gen) d->chk_gen = val; @@ -2926,11 +2901,12 @@ static ssize_t dfs_global_file_write(struct file *file, const char __user *u, size_t count, loff_t *ppos) { struct dentry *dent = file->f_path.dentry; - int val; + bool val; + int ret; - val = interpret_user_input(u, count); - if (val < 0) - return val; + ret = kstrtobool_from_user(u, count, &val); + if (unlikely(ret)) + return ret; if (dent == dfs_chk_gen) ubifs_dbg.chk_gen = val; -- 2.53.0 ______________________________________________________ Linux MTD discussion mailing list http://lists.infradead.org/mailman/listinfo/linux-mtd/ ^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCH v2 2/2] ubifs: use strscpy() and kmemdup_nul() where appropriate 2026-04-03 16:37 ` [PATCH v2 1/2] " Dmitry Antipov @ 2026-04-03 16:37 ` Dmitry Antipov 2026-04-07 2:37 ` Zhihao Cheng 0 siblings, 1 reply; 12+ messages in thread From: Dmitry Antipov @ 2026-04-03 16:37 UTC (permalink / raw) To: Zhihao Cheng; +Cc: Richard Weinberger, linux-mtd, Dmitry Antipov Go closer to the modern kernel API and use 'strscpy()' and 'kmemdup_nul()' over an ad-hoc ensure-to-have-'\0' quirks where appropriate. Signed-off-by: Dmitry Antipov <dmantipov@yandex.ru> --- v2: initial version to join the series --- fs/ubifs/journal.c | 18 ++++++------------ fs/ubifs/replay.c | 3 +-- fs/ubifs/super.c | 8 ++------ 3 files changed, 9 insertions(+), 20 deletions(-) diff --git a/fs/ubifs/journal.c b/fs/ubifs/journal.c index e28ab4395e5c..fa13e988e8b2 100644 --- a/fs/ubifs/journal.c +++ b/fs/ubifs/journal.c @@ -729,8 +729,7 @@ int ubifs_jnl_update(struct ubifs_info *c, const struct inode *dir, dent->inum = deletion ? 0 : cpu_to_le64(inode->i_ino); dent->type = get_dent_type(inode->i_mode); dent->nlen = cpu_to_le16(fname_len(nm)); - memcpy(dent->name, fname_name(nm), fname_len(nm)); - dent->name[fname_len(nm)] = '\0'; + strscpy(dent->name, fname_name(nm), fname_len(nm)); set_dent_cookie(c, dent); zero_dent_node_unused(dent); @@ -1232,8 +1231,7 @@ int ubifs_jnl_xrename(struct ubifs_info *c, const struct inode *fst_dir, dent1->inum = cpu_to_le64(fst_inode->i_ino); dent1->type = get_dent_type(fst_inode->i_mode); dent1->nlen = cpu_to_le16(fname_len(snd_nm)); - memcpy(dent1->name, fname_name(snd_nm), fname_len(snd_nm)); - dent1->name[fname_len(snd_nm)] = '\0'; + strscpy(dent1->name, fname_name(snd_nm), fname_len(snd_nm)); set_dent_cookie(c, dent1); zero_dent_node_unused(dent1); ubifs_prep_grp_node(c, dent1, dlen1, 0); @@ -1248,8 +1246,7 @@ int ubifs_jnl_xrename(struct ubifs_info *c, const struct inode *fst_dir, dent2->inum = cpu_to_le64(snd_inode->i_ino); dent2->type = get_dent_type(snd_inode->i_mode); dent2->nlen = cpu_to_le16(fname_len(fst_nm)); - memcpy(dent2->name, fname_name(fst_nm), fname_len(fst_nm)); - dent2->name[fname_len(fst_nm)] = '\0'; + strscpy(dent2->name, fname_name(fst_nm), fname_len(fst_nm)); set_dent_cookie(c, dent2); zero_dent_node_unused(dent2); ubifs_prep_grp_node(c, dent2, dlen2, 0); @@ -1424,8 +1421,7 @@ int ubifs_jnl_rename(struct ubifs_info *c, const struct inode *old_dir, dent->inum = cpu_to_le64(old_inode->i_ino); dent->type = get_dent_type(old_inode->i_mode); dent->nlen = cpu_to_le16(fname_len(new_nm)); - memcpy(dent->name, fname_name(new_nm), fname_len(new_nm)); - dent->name[fname_len(new_nm)] = '\0'; + strscpy(dent->name, fname_name(new_nm), fname_len(new_nm)); set_dent_cookie(c, dent); zero_dent_node_unused(dent); ubifs_prep_grp_node(c, dent, dlen1, 0); @@ -1446,8 +1442,7 @@ int ubifs_jnl_rename(struct ubifs_info *c, const struct inode *old_dir, dent2->type = DT_UNKNOWN; } dent2->nlen = cpu_to_le16(fname_len(old_nm)); - memcpy(dent2->name, fname_name(old_nm), fname_len(old_nm)); - dent2->name[fname_len(old_nm)] = '\0'; + strscpy(dent2->name, fname_name(old_nm), fname_len(old_nm)); set_dent_cookie(c, dent2); zero_dent_node_unused(dent2); ubifs_prep_grp_node(c, dent2, dlen2, 0); @@ -1897,8 +1892,7 @@ int ubifs_jnl_delete_xattr(struct ubifs_info *c, const struct inode *host, xent->inum = 0; xent->type = get_dent_type(inode->i_mode); xent->nlen = cpu_to_le16(fname_len(nm)); - memcpy(xent->name, fname_name(nm), fname_len(nm)); - xent->name[fname_len(nm)] = '\0'; + strscpy(xent->name, fname_name(nm), fname_len(nm)); zero_dent_node_unused(xent); ubifs_prep_grp_node(c, xent, xlen, 0); diff --git a/fs/ubifs/replay.c b/fs/ubifs/replay.c index a9a568f4a868..cb1c3fafa5c5 100644 --- a/fs/ubifs/replay.c +++ b/fs/ubifs/replay.c @@ -463,8 +463,7 @@ static int insert_dent(struct ubifs_info *c, int lnum, int offs, int len, r->sqnum = sqnum; key_copy(c, key, &r->key); fname_len(&r->nm) = nlen; - memcpy(nbuf, name, nlen); - nbuf[nlen] = '\0'; + strscpy(nbuf, name, nlen); fname_name(&r->nm) = nbuf; list_add_tail(&r->list, &c->replay_list); diff --git a/fs/ubifs/super.c b/fs/ubifs/super.c index 03bf924756ca..da2f1067f054 100644 --- a/fs/ubifs/super.c +++ b/fs/ubifs/super.c @@ -168,13 +168,11 @@ struct inode *ubifs_iget(struct super_block *sb, unsigned long inum) inode->i_op = &ubifs_file_inode_operations; inode->i_fop = &ubifs_file_operations; if (ui->xattr) { - ui->data = kmalloc(ui->data_len + 1, GFP_NOFS); + ui->data = kmemdup_nul(ino->data, ui->data_len, GFP_NOFS); if (!ui->data) { err = -ENOMEM; goto out_ino; } - memcpy(ui->data, ino->data, ui->data_len); - ((char *)ui->data)[ui->data_len] = '\0'; } else if (ui->data_len != 0) { err = 10; goto out_invalid; @@ -194,13 +192,11 @@ struct inode *ubifs_iget(struct super_block *sb, unsigned long inum) err = 12; goto out_invalid; } - ui->data = kmalloc(ui->data_len + 1, GFP_NOFS); + ui->data = kmemdup_nul(ino->data, ui->data_len, GFP_NOFS); if (!ui->data) { err = -ENOMEM; goto out_ino; } - memcpy(ui->data, ino->data, ui->data_len); - ((char *)ui->data)[ui->data_len] = '\0'; break; case S_IFBLK: case S_IFCHR: -- 2.53.0 ______________________________________________________ Linux MTD discussion mailing list http://lists.infradead.org/mailman/listinfo/linux-mtd/ ^ permalink raw reply related [flat|nested] 12+ messages in thread
* Re: [PATCH v2 2/2] ubifs: use strscpy() and kmemdup_nul() where appropriate 2026-04-03 16:37 ` [PATCH v2 2/2] ubifs: use strscpy() and kmemdup_nul() where appropriate Dmitry Antipov @ 2026-04-07 2:37 ` Zhihao Cheng 2026-04-07 16:05 ` [PATCH v3 1/2] ubifs: prefer kstrtobool_from_user() over custom helper Dmitry Antipov 0 siblings, 1 reply; 12+ messages in thread From: Zhihao Cheng @ 2026-04-07 2:37 UTC (permalink / raw) To: Dmitry Antipov; +Cc: Richard Weinberger, linux-mtd 在 2026/4/4 0:37, Dmitry Antipov 写道: > Go closer to the modern kernel API and use 'strscpy()' and 'kmemdup_nul()' > over an ad-hoc ensure-to-have-'\0' quirks where appropriate. > > Signed-off-by: Dmitry Antipov <dmantipov@yandex.ru> > --- > v2: initial version to join the series > --- > fs/ubifs/journal.c | 18 ++++++------------ > fs/ubifs/replay.c | 3 +-- > fs/ubifs/super.c | 8 ++------ > 3 files changed, 9 insertions(+), 20 deletions(-) > > diff --git a/fs/ubifs/journal.c b/fs/ubifs/journal.c > index e28ab4395e5c..fa13e988e8b2 100644 > --- a/fs/ubifs/journal.c > +++ b/fs/ubifs/journal.c > @@ -729,8 +729,7 @@ int ubifs_jnl_update(struct ubifs_info *c, const struct inode *dir, > dent->inum = deletion ? 0 : cpu_to_le64(inode->i_ino); > dent->type = get_dent_type(inode->i_mode); > dent->nlen = cpu_to_le16(fname_len(nm)); > - memcpy(dent->name, fname_name(nm), fname_len(nm)); > - dent->name[fname_len(nm)] = '\0'; > + strscpy(dent->name, fname_name(nm), fname_len(nm)); The 'size' param in strscpy() is the size of dst buf, not the string name length. > set_dent_cookie(c, dent); > > zero_dent_node_unused(dent); > @@ -1232,8 +1231,7 @@ int ubifs_jnl_xrename(struct ubifs_info *c, const struct inode *fst_dir, > dent1->inum = cpu_to_le64(fst_inode->i_ino); > dent1->type = get_dent_type(fst_inode->i_mode); > dent1->nlen = cpu_to_le16(fname_len(snd_nm)); > - memcpy(dent1->name, fname_name(snd_nm), fname_len(snd_nm)); > - dent1->name[fname_len(snd_nm)] = '\0'; > + strscpy(dent1->name, fname_name(snd_nm), fname_len(snd_nm)); > set_dent_cookie(c, dent1); > zero_dent_node_unused(dent1); > ubifs_prep_grp_node(c, dent1, dlen1, 0); > @@ -1248,8 +1246,7 @@ int ubifs_jnl_xrename(struct ubifs_info *c, const struct inode *fst_dir, > dent2->inum = cpu_to_le64(snd_inode->i_ino); > dent2->type = get_dent_type(snd_inode->i_mode); > dent2->nlen = cpu_to_le16(fname_len(fst_nm)); > - memcpy(dent2->name, fname_name(fst_nm), fname_len(fst_nm)); > - dent2->name[fname_len(fst_nm)] = '\0'; > + strscpy(dent2->name, fname_name(fst_nm), fname_len(fst_nm)); > set_dent_cookie(c, dent2); > zero_dent_node_unused(dent2); > ubifs_prep_grp_node(c, dent2, dlen2, 0); > @@ -1424,8 +1421,7 @@ int ubifs_jnl_rename(struct ubifs_info *c, const struct inode *old_dir, > dent->inum = cpu_to_le64(old_inode->i_ino); > dent->type = get_dent_type(old_inode->i_mode); > dent->nlen = cpu_to_le16(fname_len(new_nm)); > - memcpy(dent->name, fname_name(new_nm), fname_len(new_nm)); > - dent->name[fname_len(new_nm)] = '\0'; > + strscpy(dent->name, fname_name(new_nm), fname_len(new_nm)); > set_dent_cookie(c, dent); > zero_dent_node_unused(dent); > ubifs_prep_grp_node(c, dent, dlen1, 0); > @@ -1446,8 +1442,7 @@ int ubifs_jnl_rename(struct ubifs_info *c, const struct inode *old_dir, > dent2->type = DT_UNKNOWN; > } > dent2->nlen = cpu_to_le16(fname_len(old_nm)); > - memcpy(dent2->name, fname_name(old_nm), fname_len(old_nm)); > - dent2->name[fname_len(old_nm)] = '\0'; > + strscpy(dent2->name, fname_name(old_nm), fname_len(old_nm)); > set_dent_cookie(c, dent2); > zero_dent_node_unused(dent2); > ubifs_prep_grp_node(c, dent2, dlen2, 0); > @@ -1897,8 +1892,7 @@ int ubifs_jnl_delete_xattr(struct ubifs_info *c, const struct inode *host, > xent->inum = 0; > xent->type = get_dent_type(inode->i_mode); > xent->nlen = cpu_to_le16(fname_len(nm)); > - memcpy(xent->name, fname_name(nm), fname_len(nm)); > - xent->name[fname_len(nm)] = '\0'; > + strscpy(xent->name, fname_name(nm), fname_len(nm)); > zero_dent_node_unused(xent); > ubifs_prep_grp_node(c, xent, xlen, 0); > > diff --git a/fs/ubifs/replay.c b/fs/ubifs/replay.c > index a9a568f4a868..cb1c3fafa5c5 100644 > --- a/fs/ubifs/replay.c > +++ b/fs/ubifs/replay.c > @@ -463,8 +463,7 @@ static int insert_dent(struct ubifs_info *c, int lnum, int offs, int len, > r->sqnum = sqnum; > key_copy(c, key, &r->key); > fname_len(&r->nm) = nlen; > - memcpy(nbuf, name, nlen); > - nbuf[nlen] = '\0'; > + strscpy(nbuf, name, nlen); > fname_name(&r->nm) = nbuf; > > list_add_tail(&r->list, &c->replay_list); > diff --git a/fs/ubifs/super.c b/fs/ubifs/super.c > index 03bf924756ca..da2f1067f054 100644 > --- a/fs/ubifs/super.c > +++ b/fs/ubifs/super.c > @@ -168,13 +168,11 @@ struct inode *ubifs_iget(struct super_block *sb, unsigned long inum) > inode->i_op = &ubifs_file_inode_operations; > inode->i_fop = &ubifs_file_operations; > if (ui->xattr) { > - ui->data = kmalloc(ui->data_len + 1, GFP_NOFS); > + ui->data = kmemdup_nul(ino->data, ui->data_len, GFP_NOFS); > if (!ui->data) { > err = -ENOMEM; > goto out_ino; > } > - memcpy(ui->data, ino->data, ui->data_len); > - ((char *)ui->data)[ui->data_len] = '\0'; > } else if (ui->data_len != 0) { > err = 10; > goto out_invalid; > @@ -194,13 +192,11 @@ struct inode *ubifs_iget(struct super_block *sb, unsigned long inum) > err = 12; > goto out_invalid; > } > - ui->data = kmalloc(ui->data_len + 1, GFP_NOFS); > + ui->data = kmemdup_nul(ino->data, ui->data_len, GFP_NOFS); > if (!ui->data) { > err = -ENOMEM; > goto out_ino; > } > - memcpy(ui->data, ino->data, ui->data_len); > - ((char *)ui->data)[ui->data_len] = '\0'; > break; > case S_IFBLK: > case S_IFCHR: > ______________________________________________________ Linux MTD discussion mailing list http://lists.infradead.org/mailman/listinfo/linux-mtd/ ^ permalink raw reply [flat|nested] 12+ messages in thread
* [PATCH v3 1/2] ubifs: prefer kstrtobool_from_user() over custom helper 2026-04-07 2:37 ` Zhihao Cheng @ 2026-04-07 16:05 ` Dmitry Antipov 2026-04-07 16:05 ` [PATCH v3 2/2] ubifs: use strscpy() and kmemdup_nul() where appropriate Dmitry Antipov 0 siblings, 1 reply; 12+ messages in thread From: Dmitry Antipov @ 2026-04-07 16:05 UTC (permalink / raw) To: Zhihao Cheng; +Cc: Richard Weinberger, linux-mtd, Dmitry Antipov Adjust 'dfs_file_write()' and 'dfs_global_file_write()' to prefer generic 'kstrtobool_from_user()' over an ad-hoc 'interpret_user_input()' helper, thus making the latter not needed anymore. Reviewed-by: Zhihao Cheng <chengzhihao1@huawei.com> Signed-off-by: Dmitry Antipov <dmantipov@yandex.ru> --- v3: bump version to match the series v2: add Reviewed-by: and bump version to match the series --- fs/ubifs/debug.c | 44 ++++++++++---------------------------------- 1 file changed, 10 insertions(+), 34 deletions(-) diff --git a/fs/ubifs/debug.c b/fs/ubifs/debug.c index 160c16aa7b6e..252cf82012cf 100644 --- a/fs/ubifs/debug.c +++ b/fs/ubifs/debug.c @@ -2732,39 +2732,14 @@ static ssize_t dfs_file_read(struct file *file, char __user *u, size_t count, return provide_user_output(val, u, count, ppos); } -/** - * interpret_user_input - interpret user debugfs file input. - * @u: user-provided buffer with the input - * @count: buffer size - * - * This is a helper function which interpret user input to a boolean UBIFS - * debugfs file. Returns %0 or %1 in case of success and a negative error code - * in case of failure. - */ -static int interpret_user_input(const char __user *u, size_t count) -{ - size_t buf_size; - char buf[8]; - - buf_size = min_t(size_t, count, (sizeof(buf) - 1)); - if (copy_from_user(buf, u, buf_size)) - return -EFAULT; - - if (buf[0] == '1') - return 1; - else if (buf[0] == '0') - return 0; - - return -EINVAL; -} - static ssize_t dfs_file_write(struct file *file, const char __user *u, size_t count, loff_t *ppos) { struct ubifs_info *c = file->private_data; struct ubifs_debug_info *d = c->dbg; struct dentry *dent = file->f_path.dentry; - int val; + bool val; + int ret; if (file->f_path.dentry == d->dfs_dump_lprops) { ubifs_dump_lprops(c); @@ -2781,9 +2756,9 @@ static ssize_t dfs_file_write(struct file *file, const char __user *u, return count; } - val = interpret_user_input(u, count); - if (val < 0) - return val; + ret = kstrtobool_from_user(u, count, &val); + if (unlikely(ret)) + return ret; if (dent == d->dfs_chk_gen) d->chk_gen = val; @@ -2926,11 +2901,12 @@ static ssize_t dfs_global_file_write(struct file *file, const char __user *u, size_t count, loff_t *ppos) { struct dentry *dent = file->f_path.dentry; - int val; + bool val; + int ret; - val = interpret_user_input(u, count); - if (val < 0) - return val; + ret = kstrtobool_from_user(u, count, &val); + if (unlikely(ret)) + return ret; if (dent == dfs_chk_gen) ubifs_dbg.chk_gen = val; -- 2.53.0 ______________________________________________________ Linux MTD discussion mailing list http://lists.infradead.org/mailman/listinfo/linux-mtd/ ^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCH v3 2/2] ubifs: use strscpy() and kmemdup_nul() where appropriate 2026-04-07 16:05 ` [PATCH v3 1/2] ubifs: prefer kstrtobool_from_user() over custom helper Dmitry Antipov @ 2026-04-07 16:05 ` Dmitry Antipov 2026-04-08 6:09 ` Zhihao Cheng 0 siblings, 1 reply; 12+ messages in thread From: Dmitry Antipov @ 2026-04-07 16:05 UTC (permalink / raw) To: Zhihao Cheng; +Cc: Richard Weinberger, linux-mtd, Dmitry Antipov Go closer to the modern kernel API and use 'strscpy()' and 'kmemdup_nul()' over an ad-hoc ensure-to-have-'\0' quirks where appropriate. Signed-off-by: Dmitry Antipov <dmantipov@yandex.ru> --- v3: fix strscpy() usage as noticed by Zhihao v2: initial version to join the series --- fs/ubifs/journal.c | 18 ++++++------------ fs/ubifs/replay.c | 3 +-- fs/ubifs/super.c | 8 ++------ 3 files changed, 9 insertions(+), 20 deletions(-) diff --git a/fs/ubifs/journal.c b/fs/ubifs/journal.c index e28ab4395e5c..b8c4ab8990c2 100644 --- a/fs/ubifs/journal.c +++ b/fs/ubifs/journal.c @@ -729,8 +729,7 @@ int ubifs_jnl_update(struct ubifs_info *c, const struct inode *dir, dent->inum = deletion ? 0 : cpu_to_le64(inode->i_ino); dent->type = get_dent_type(inode->i_mode); dent->nlen = cpu_to_le16(fname_len(nm)); - memcpy(dent->name, fname_name(nm), fname_len(nm)); - dent->name[fname_len(nm)] = '\0'; + strscpy(dent->name, fname_name(nm), dent->nlen + 1); set_dent_cookie(c, dent); zero_dent_node_unused(dent); @@ -1232,8 +1231,7 @@ int ubifs_jnl_xrename(struct ubifs_info *c, const struct inode *fst_dir, dent1->inum = cpu_to_le64(fst_inode->i_ino); dent1->type = get_dent_type(fst_inode->i_mode); dent1->nlen = cpu_to_le16(fname_len(snd_nm)); - memcpy(dent1->name, fname_name(snd_nm), fname_len(snd_nm)); - dent1->name[fname_len(snd_nm)] = '\0'; + strscpy(dent1->name, fname_name(snd_nm), dent1->nlen + 1); set_dent_cookie(c, dent1); zero_dent_node_unused(dent1); ubifs_prep_grp_node(c, dent1, dlen1, 0); @@ -1248,8 +1246,7 @@ int ubifs_jnl_xrename(struct ubifs_info *c, const struct inode *fst_dir, dent2->inum = cpu_to_le64(snd_inode->i_ino); dent2->type = get_dent_type(snd_inode->i_mode); dent2->nlen = cpu_to_le16(fname_len(fst_nm)); - memcpy(dent2->name, fname_name(fst_nm), fname_len(fst_nm)); - dent2->name[fname_len(fst_nm)] = '\0'; + strscpy(dent2->name, fname_name(fst_nm), dent2->nlen + 1); set_dent_cookie(c, dent2); zero_dent_node_unused(dent2); ubifs_prep_grp_node(c, dent2, dlen2, 0); @@ -1424,8 +1421,7 @@ int ubifs_jnl_rename(struct ubifs_info *c, const struct inode *old_dir, dent->inum = cpu_to_le64(old_inode->i_ino); dent->type = get_dent_type(old_inode->i_mode); dent->nlen = cpu_to_le16(fname_len(new_nm)); - memcpy(dent->name, fname_name(new_nm), fname_len(new_nm)); - dent->name[fname_len(new_nm)] = '\0'; + strscpy(dent->name, fname_name(new_nm), dent->nlen + 1); set_dent_cookie(c, dent); zero_dent_node_unused(dent); ubifs_prep_grp_node(c, dent, dlen1, 0); @@ -1446,8 +1442,7 @@ int ubifs_jnl_rename(struct ubifs_info *c, const struct inode *old_dir, dent2->type = DT_UNKNOWN; } dent2->nlen = cpu_to_le16(fname_len(old_nm)); - memcpy(dent2->name, fname_name(old_nm), fname_len(old_nm)); - dent2->name[fname_len(old_nm)] = '\0'; + strscpy(dent2->name, fname_name(old_nm), dent2->nlen + 1); set_dent_cookie(c, dent2); zero_dent_node_unused(dent2); ubifs_prep_grp_node(c, dent2, dlen2, 0); @@ -1897,8 +1892,7 @@ int ubifs_jnl_delete_xattr(struct ubifs_info *c, const struct inode *host, xent->inum = 0; xent->type = get_dent_type(inode->i_mode); xent->nlen = cpu_to_le16(fname_len(nm)); - memcpy(xent->name, fname_name(nm), fname_len(nm)); - xent->name[fname_len(nm)] = '\0'; + strscpy(xent->name, fname_name(nm), xent->nlen + 1); zero_dent_node_unused(xent); ubifs_prep_grp_node(c, xent, xlen, 0); diff --git a/fs/ubifs/replay.c b/fs/ubifs/replay.c index a9a568f4a868..ef6ae63792d1 100644 --- a/fs/ubifs/replay.c +++ b/fs/ubifs/replay.c @@ -463,8 +463,7 @@ static int insert_dent(struct ubifs_info *c, int lnum, int offs, int len, r->sqnum = sqnum; key_copy(c, key, &r->key); fname_len(&r->nm) = nlen; - memcpy(nbuf, name, nlen); - nbuf[nlen] = '\0'; + strscpy(nbuf, name, nlen + 1); fname_name(&r->nm) = nbuf; list_add_tail(&r->list, &c->replay_list); diff --git a/fs/ubifs/super.c b/fs/ubifs/super.c index 03bf924756ca..da2f1067f054 100644 --- a/fs/ubifs/super.c +++ b/fs/ubifs/super.c @@ -168,13 +168,11 @@ struct inode *ubifs_iget(struct super_block *sb, unsigned long inum) inode->i_op = &ubifs_file_inode_operations; inode->i_fop = &ubifs_file_operations; if (ui->xattr) { - ui->data = kmalloc(ui->data_len + 1, GFP_NOFS); + ui->data = kmemdup_nul(ino->data, ui->data_len, GFP_NOFS); if (!ui->data) { err = -ENOMEM; goto out_ino; } - memcpy(ui->data, ino->data, ui->data_len); - ((char *)ui->data)[ui->data_len] = '\0'; } else if (ui->data_len != 0) { err = 10; goto out_invalid; @@ -194,13 +192,11 @@ struct inode *ubifs_iget(struct super_block *sb, unsigned long inum) err = 12; goto out_invalid; } - ui->data = kmalloc(ui->data_len + 1, GFP_NOFS); + ui->data = kmemdup_nul(ino->data, ui->data_len, GFP_NOFS); if (!ui->data) { err = -ENOMEM; goto out_ino; } - memcpy(ui->data, ino->data, ui->data_len); - ((char *)ui->data)[ui->data_len] = '\0'; break; case S_IFBLK: case S_IFCHR: -- 2.53.0 ______________________________________________________ Linux MTD discussion mailing list http://lists.infradead.org/mailman/listinfo/linux-mtd/ ^ permalink raw reply related [flat|nested] 12+ messages in thread
* Re: [PATCH v3 2/2] ubifs: use strscpy() and kmemdup_nul() where appropriate 2026-04-07 16:05 ` [PATCH v3 2/2] ubifs: use strscpy() and kmemdup_nul() where appropriate Dmitry Antipov @ 2026-04-08 6:09 ` Zhihao Cheng 2026-04-09 4:56 ` [PATCH v4 1/2] ubifs: prefer kstrtobool_from_user() over custom helper Dmitry Antipov 0 siblings, 1 reply; 12+ messages in thread From: Zhihao Cheng @ 2026-04-08 6:09 UTC (permalink / raw) To: Dmitry Antipov; +Cc: Richard Weinberger, linux-mtd 在 2026/4/8 0:05, Dmitry Antipov 写道: > Go closer to the modern kernel API and use 'strscpy()' and 'kmemdup_nul()' > over an ad-hoc ensure-to-have-'\0' quirks where appropriate. > > Signed-off-by: Dmitry Antipov <dmantipov@yandex.ru> > --- > v3: fix strscpy() usage as noticed by Zhihao > v2: initial version to join the series > --- > fs/ubifs/journal.c | 18 ++++++------------ > fs/ubifs/replay.c | 3 +-- > fs/ubifs/super.c | 8 ++------ > 3 files changed, 9 insertions(+), 20 deletions(-) > > diff --git a/fs/ubifs/journal.c b/fs/ubifs/journal.c > index e28ab4395e5c..b8c4ab8990c2 100644 > --- a/fs/ubifs/journal.c > +++ b/fs/ubifs/journal.c > @@ -729,8 +729,7 @@ int ubifs_jnl_update(struct ubifs_info *c, const struct inode *dir, > dent->inum = deletion ? 0 : cpu_to_le64(inode->i_ino); > dent->type = get_dent_type(inode->i_mode); > dent->nlen = cpu_to_le16(fname_len(nm)); > - memcpy(dent->name, fname_name(nm), fname_len(nm)); > - dent->name[fname_len(nm)] = '\0'; > + strscpy(dent->name, fname_name(nm), dent->nlen + 1); The 'dent->nlen' is a little endian type, cannot be used directly. > set_dent_cookie(c, dent); > > zero_dent_node_unused(dent); ______________________________________________________ Linux MTD discussion mailing list http://lists.infradead.org/mailman/listinfo/linux-mtd/ ^ permalink raw reply [flat|nested] 12+ messages in thread
* [PATCH v4 1/2] ubifs: prefer kstrtobool_from_user() over custom helper 2026-04-08 6:09 ` Zhihao Cheng @ 2026-04-09 4:56 ` Dmitry Antipov 2026-04-09 4:56 ` [PATCH v4 2/2] ubifs: use strscpy() and kmemdup_nul() where appropriate Dmitry Antipov 0 siblings, 1 reply; 12+ messages in thread From: Dmitry Antipov @ 2026-04-09 4:56 UTC (permalink / raw) To: Zhihao Cheng; +Cc: Richard Weinberger, linux-mtd, Dmitry Antipov Adjust 'dfs_file_write()' and 'dfs_global_file_write()' to prefer generic 'kstrtobool_from_user()' over an ad-hoc 'interpret_user_input()' helper, thus making the latter not needed anymore. Reviewed-by: Zhihao Cheng <chengzhihao1@huawei.com> Signed-off-by: Dmitry Antipov <dmantipov@yandex.ru> --- v3 and upwards: bump version to match the series v2: add Reviewed-by: and bump version to match the series --- fs/ubifs/debug.c | 44 ++++++++++---------------------------------- 1 file changed, 10 insertions(+), 34 deletions(-) diff --git a/fs/ubifs/debug.c b/fs/ubifs/debug.c index 160c16aa7b6e..252cf82012cf 100644 --- a/fs/ubifs/debug.c +++ b/fs/ubifs/debug.c @@ -2732,39 +2732,14 @@ static ssize_t dfs_file_read(struct file *file, char __user *u, size_t count, return provide_user_output(val, u, count, ppos); } -/** - * interpret_user_input - interpret user debugfs file input. - * @u: user-provided buffer with the input - * @count: buffer size - * - * This is a helper function which interpret user input to a boolean UBIFS - * debugfs file. Returns %0 or %1 in case of success and a negative error code - * in case of failure. - */ -static int interpret_user_input(const char __user *u, size_t count) -{ - size_t buf_size; - char buf[8]; - - buf_size = min_t(size_t, count, (sizeof(buf) - 1)); - if (copy_from_user(buf, u, buf_size)) - return -EFAULT; - - if (buf[0] == '1') - return 1; - else if (buf[0] == '0') - return 0; - - return -EINVAL; -} - static ssize_t dfs_file_write(struct file *file, const char __user *u, size_t count, loff_t *ppos) { struct ubifs_info *c = file->private_data; struct ubifs_debug_info *d = c->dbg; struct dentry *dent = file->f_path.dentry; - int val; + bool val; + int ret; if (file->f_path.dentry == d->dfs_dump_lprops) { ubifs_dump_lprops(c); @@ -2781,9 +2756,9 @@ static ssize_t dfs_file_write(struct file *file, const char __user *u, return count; } - val = interpret_user_input(u, count); - if (val < 0) - return val; + ret = kstrtobool_from_user(u, count, &val); + if (unlikely(ret)) + return ret; if (dent == d->dfs_chk_gen) d->chk_gen = val; @@ -2926,11 +2901,12 @@ static ssize_t dfs_global_file_write(struct file *file, const char __user *u, size_t count, loff_t *ppos) { struct dentry *dent = file->f_path.dentry; - int val; + bool val; + int ret; - val = interpret_user_input(u, count); - if (val < 0) - return val; + ret = kstrtobool_from_user(u, count, &val); + if (unlikely(ret)) + return ret; if (dent == dfs_chk_gen) ubifs_dbg.chk_gen = val; -- 2.53.0 ______________________________________________________ Linux MTD discussion mailing list http://lists.infradead.org/mailman/listinfo/linux-mtd/ ^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCH v4 2/2] ubifs: use strscpy() and kmemdup_nul() where appropriate 2026-04-09 4:56 ` [PATCH v4 1/2] ubifs: prefer kstrtobool_from_user() over custom helper Dmitry Antipov @ 2026-04-09 4:56 ` Dmitry Antipov 2026-04-10 1:06 ` Zhihao Cheng 0 siblings, 1 reply; 12+ messages in thread From: Dmitry Antipov @ 2026-04-09 4:56 UTC (permalink / raw) To: Zhihao Cheng; +Cc: Richard Weinberger, linux-mtd, Dmitry Antipov Go closer to the modern kernel API and use 'strscpy()' and 'kmemdup_nul()' over an ad-hoc ensure-to-have-'\0' quirks where appropriate. Signed-off-by: Dmitry Antipov <dmantipov@yandex.ru> --- v4: once again to not forget a filesystem-native (little) to CPU endian swap v3: fix strscpy() usage as noticed by Zhihao v2: initial version to join the series --- fs/ubifs/journal.c | 18 ++++++------------ fs/ubifs/replay.c | 3 +-- fs/ubifs/super.c | 8 ++------ 3 files changed, 9 insertions(+), 20 deletions(-) diff --git a/fs/ubifs/journal.c b/fs/ubifs/journal.c index e28ab4395e5c..43e19c83ad6d 100644 --- a/fs/ubifs/journal.c +++ b/fs/ubifs/journal.c @@ -729,8 +729,7 @@ int ubifs_jnl_update(struct ubifs_info *c, const struct inode *dir, dent->inum = deletion ? 0 : cpu_to_le64(inode->i_ino); dent->type = get_dent_type(inode->i_mode); dent->nlen = cpu_to_le16(fname_len(nm)); - memcpy(dent->name, fname_name(nm), fname_len(nm)); - dent->name[fname_len(nm)] = '\0'; + strscpy(dent->name, fname_name(nm), le16_to_cpu(dent->nlen) + 1); set_dent_cookie(c, dent); zero_dent_node_unused(dent); @@ -1232,8 +1231,7 @@ int ubifs_jnl_xrename(struct ubifs_info *c, const struct inode *fst_dir, dent1->inum = cpu_to_le64(fst_inode->i_ino); dent1->type = get_dent_type(fst_inode->i_mode); dent1->nlen = cpu_to_le16(fname_len(snd_nm)); - memcpy(dent1->name, fname_name(snd_nm), fname_len(snd_nm)); - dent1->name[fname_len(snd_nm)] = '\0'; + strscpy(dent1->name, fname_name(snd_nm), le16_to_cpu(dent1->nlen) + 1); set_dent_cookie(c, dent1); zero_dent_node_unused(dent1); ubifs_prep_grp_node(c, dent1, dlen1, 0); @@ -1248,8 +1246,7 @@ int ubifs_jnl_xrename(struct ubifs_info *c, const struct inode *fst_dir, dent2->inum = cpu_to_le64(snd_inode->i_ino); dent2->type = get_dent_type(snd_inode->i_mode); dent2->nlen = cpu_to_le16(fname_len(fst_nm)); - memcpy(dent2->name, fname_name(fst_nm), fname_len(fst_nm)); - dent2->name[fname_len(fst_nm)] = '\0'; + strscpy(dent2->name, fname_name(fst_nm), le16_to_cpu(dent2->nlen) + 1); set_dent_cookie(c, dent2); zero_dent_node_unused(dent2); ubifs_prep_grp_node(c, dent2, dlen2, 0); @@ -1424,8 +1421,7 @@ int ubifs_jnl_rename(struct ubifs_info *c, const struct inode *old_dir, dent->inum = cpu_to_le64(old_inode->i_ino); dent->type = get_dent_type(old_inode->i_mode); dent->nlen = cpu_to_le16(fname_len(new_nm)); - memcpy(dent->name, fname_name(new_nm), fname_len(new_nm)); - dent->name[fname_len(new_nm)] = '\0'; + strscpy(dent->name, fname_name(new_nm), le16_to_cpu(dent->nlen) + 1); set_dent_cookie(c, dent); zero_dent_node_unused(dent); ubifs_prep_grp_node(c, dent, dlen1, 0); @@ -1446,8 +1442,7 @@ int ubifs_jnl_rename(struct ubifs_info *c, const struct inode *old_dir, dent2->type = DT_UNKNOWN; } dent2->nlen = cpu_to_le16(fname_len(old_nm)); - memcpy(dent2->name, fname_name(old_nm), fname_len(old_nm)); - dent2->name[fname_len(old_nm)] = '\0'; + strscpy(dent2->name, fname_name(old_nm), le16_to_cpu(dent2->nlen) + 1); set_dent_cookie(c, dent2); zero_dent_node_unused(dent2); ubifs_prep_grp_node(c, dent2, dlen2, 0); @@ -1897,8 +1892,7 @@ int ubifs_jnl_delete_xattr(struct ubifs_info *c, const struct inode *host, xent->inum = 0; xent->type = get_dent_type(inode->i_mode); xent->nlen = cpu_to_le16(fname_len(nm)); - memcpy(xent->name, fname_name(nm), fname_len(nm)); - xent->name[fname_len(nm)] = '\0'; + strscpy(xent->name, fname_name(nm), le16_to_cpu(xent->nlen) + 1); zero_dent_node_unused(xent); ubifs_prep_grp_node(c, xent, xlen, 0); diff --git a/fs/ubifs/replay.c b/fs/ubifs/replay.c index a9a568f4a868..ef6ae63792d1 100644 --- a/fs/ubifs/replay.c +++ b/fs/ubifs/replay.c @@ -463,8 +463,7 @@ static int insert_dent(struct ubifs_info *c, int lnum, int offs, int len, r->sqnum = sqnum; key_copy(c, key, &r->key); fname_len(&r->nm) = nlen; - memcpy(nbuf, name, nlen); - nbuf[nlen] = '\0'; + strscpy(nbuf, name, nlen + 1); fname_name(&r->nm) = nbuf; list_add_tail(&r->list, &c->replay_list); diff --git a/fs/ubifs/super.c b/fs/ubifs/super.c index 03bf924756ca..da2f1067f054 100644 --- a/fs/ubifs/super.c +++ b/fs/ubifs/super.c @@ -168,13 +168,11 @@ struct inode *ubifs_iget(struct super_block *sb, unsigned long inum) inode->i_op = &ubifs_file_inode_operations; inode->i_fop = &ubifs_file_operations; if (ui->xattr) { - ui->data = kmalloc(ui->data_len + 1, GFP_NOFS); + ui->data = kmemdup_nul(ino->data, ui->data_len, GFP_NOFS); if (!ui->data) { err = -ENOMEM; goto out_ino; } - memcpy(ui->data, ino->data, ui->data_len); - ((char *)ui->data)[ui->data_len] = '\0'; } else if (ui->data_len != 0) { err = 10; goto out_invalid; @@ -194,13 +192,11 @@ struct inode *ubifs_iget(struct super_block *sb, unsigned long inum) err = 12; goto out_invalid; } - ui->data = kmalloc(ui->data_len + 1, GFP_NOFS); + ui->data = kmemdup_nul(ino->data, ui->data_len, GFP_NOFS); if (!ui->data) { err = -ENOMEM; goto out_ino; } - memcpy(ui->data, ino->data, ui->data_len); - ((char *)ui->data)[ui->data_len] = '\0'; break; case S_IFBLK: case S_IFCHR: -- 2.53.0 ______________________________________________________ Linux MTD discussion mailing list http://lists.infradead.org/mailman/listinfo/linux-mtd/ ^ permalink raw reply related [flat|nested] 12+ messages in thread
* Re: [PATCH v4 2/2] ubifs: use strscpy() and kmemdup_nul() where appropriate 2026-04-09 4:56 ` [PATCH v4 2/2] ubifs: use strscpy() and kmemdup_nul() where appropriate Dmitry Antipov @ 2026-04-10 1:06 ` Zhihao Cheng 2026-04-10 5:57 ` Richard Weinberger 0 siblings, 1 reply; 12+ messages in thread From: Zhihao Cheng @ 2026-04-10 1:06 UTC (permalink / raw) To: Dmitry Antipov; +Cc: Richard Weinberger, linux-mtd 在 2026/4/9 12:56, Dmitry Antipov 写道: > Go closer to the modern kernel API and use 'strscpy()' and 'kmemdup_nul()' > over an ad-hoc ensure-to-have-'\0' quirks where appropriate. > > Signed-off-by: Dmitry Antipov <dmantipov@yandex.ru> > --- > v4: once again to not forget a filesystem-native (little) to CPU endian swap > v3: fix strscpy() usage as noticed by Zhihao > v2: initial version to join the series > --- > fs/ubifs/journal.c | 18 ++++++------------ > fs/ubifs/replay.c | 3 +-- > fs/ubifs/super.c | 8 ++------ > 3 files changed, 9 insertions(+), 20 deletions(-) > > diff --git a/fs/ubifs/journal.c b/fs/ubifs/journal.c > index e28ab4395e5c..43e19c83ad6d 100644 > --- a/fs/ubifs/journal.c > +++ b/fs/ubifs/journal.c > @@ -729,8 +729,7 @@ int ubifs_jnl_update(struct ubifs_info *c, const struct inode *dir, > dent->inum = deletion ? 0 : cpu_to_le64(inode->i_ino); > dent->type = get_dent_type(inode->i_mode); > dent->nlen = cpu_to_le16(fname_len(nm)); > - memcpy(dent->name, fname_name(nm), fname_len(nm)); > - dent->name[fname_len(nm)] = '\0'; > + strscpy(dent->name, fname_name(nm), le16_to_cpu(dent->nlen) + 1); I think we can use 'fname_len(nm) + 1' to replace 'le16_to_cpu(dent->nlen) + 1'. > set_dent_cookie(c, dent); > > zero_dent_node_unused(dent); > @@ -1232,8 +1231,7 @@ int ubifs_jnl_xrename(struct ubifs_info *c, const struct inode *fst_dir, > dent1->inum = cpu_to_le64(fst_inode->i_ino); > dent1->type = get_dent_type(fst_inode->i_mode); > dent1->nlen = cpu_to_le16(fname_len(snd_nm)); > - memcpy(dent1->name, fname_name(snd_nm), fname_len(snd_nm)); > - dent1->name[fname_len(snd_nm)] = '\0'; > + strscpy(dent1->name, fname_name(snd_nm), le16_to_cpu(dent1->nlen) + 1); > set_dent_cookie(c, dent1); > zero_dent_node_unused(dent1); > ubifs_prep_grp_node(c, dent1, dlen1, 0); > @@ -1248,8 +1246,7 @@ int ubifs_jnl_xrename(struct ubifs_info *c, const struct inode *fst_dir, > dent2->inum = cpu_to_le64(snd_inode->i_ino); > dent2->type = get_dent_type(snd_inode->i_mode); > dent2->nlen = cpu_to_le16(fname_len(fst_nm)); > - memcpy(dent2->name, fname_name(fst_nm), fname_len(fst_nm)); > - dent2->name[fname_len(fst_nm)] = '\0'; > + strscpy(dent2->name, fname_name(fst_nm), le16_to_cpu(dent2->nlen) + 1); > set_dent_cookie(c, dent2); > zero_dent_node_unused(dent2); > ubifs_prep_grp_node(c, dent2, dlen2, 0); > @@ -1424,8 +1421,7 @@ int ubifs_jnl_rename(struct ubifs_info *c, const struct inode *old_dir, > dent->inum = cpu_to_le64(old_inode->i_ino); > dent->type = get_dent_type(old_inode->i_mode); > dent->nlen = cpu_to_le16(fname_len(new_nm)); > - memcpy(dent->name, fname_name(new_nm), fname_len(new_nm)); > - dent->name[fname_len(new_nm)] = '\0'; > + strscpy(dent->name, fname_name(new_nm), le16_to_cpu(dent->nlen) + 1); > set_dent_cookie(c, dent); > zero_dent_node_unused(dent); > ubifs_prep_grp_node(c, dent, dlen1, 0); > @@ -1446,8 +1442,7 @@ int ubifs_jnl_rename(struct ubifs_info *c, const struct inode *old_dir, > dent2->type = DT_UNKNOWN; > } > dent2->nlen = cpu_to_le16(fname_len(old_nm)); > - memcpy(dent2->name, fname_name(old_nm), fname_len(old_nm)); > - dent2->name[fname_len(old_nm)] = '\0'; > + strscpy(dent2->name, fname_name(old_nm), le16_to_cpu(dent2->nlen) + 1); > set_dent_cookie(c, dent2); > zero_dent_node_unused(dent2); > ubifs_prep_grp_node(c, dent2, dlen2, 0); > @@ -1897,8 +1892,7 @@ int ubifs_jnl_delete_xattr(struct ubifs_info *c, const struct inode *host, > xent->inum = 0; > xent->type = get_dent_type(inode->i_mode); > xent->nlen = cpu_to_le16(fname_len(nm)); > - memcpy(xent->name, fname_name(nm), fname_len(nm)); > - xent->name[fname_len(nm)] = '\0'; > + strscpy(xent->name, fname_name(nm), le16_to_cpu(xent->nlen) + 1); > zero_dent_node_unused(xent); > ubifs_prep_grp_node(c, xent, xlen, 0); > > diff --git a/fs/ubifs/replay.c b/fs/ubifs/replay.c > index a9a568f4a868..ef6ae63792d1 100644 > --- a/fs/ubifs/replay.c > +++ b/fs/ubifs/replay.c > @@ -463,8 +463,7 @@ static int insert_dent(struct ubifs_info *c, int lnum, int offs, int len, > r->sqnum = sqnum; > key_copy(c, key, &r->key); > fname_len(&r->nm) = nlen; > - memcpy(nbuf, name, nlen); > - nbuf[nlen] = '\0'; > + strscpy(nbuf, name, nlen + 1); > fname_name(&r->nm) = nbuf; > > list_add_tail(&r->list, &c->replay_list); > diff --git a/fs/ubifs/super.c b/fs/ubifs/super.c > index 03bf924756ca..da2f1067f054 100644 > --- a/fs/ubifs/super.c > +++ b/fs/ubifs/super.c > @@ -168,13 +168,11 @@ struct inode *ubifs_iget(struct super_block *sb, unsigned long inum) > inode->i_op = &ubifs_file_inode_operations; > inode->i_fop = &ubifs_file_operations; > if (ui->xattr) { > - ui->data = kmalloc(ui->data_len + 1, GFP_NOFS); > + ui->data = kmemdup_nul(ino->data, ui->data_len, GFP_NOFS); > if (!ui->data) { > err = -ENOMEM; > goto out_ino; > } > - memcpy(ui->data, ino->data, ui->data_len); > - ((char *)ui->data)[ui->data_len] = '\0'; > } else if (ui->data_len != 0) { > err = 10; > goto out_invalid; > @@ -194,13 +192,11 @@ struct inode *ubifs_iget(struct super_block *sb, unsigned long inum) > err = 12; > goto out_invalid; > } > - ui->data = kmalloc(ui->data_len + 1, GFP_NOFS); > + ui->data = kmemdup_nul(ino->data, ui->data_len, GFP_NOFS); > if (!ui->data) { > err = -ENOMEM; > goto out_ino; > } > - memcpy(ui->data, ino->data, ui->data_len); > - ((char *)ui->data)[ui->data_len] = '\0'; > break; > case S_IFBLK: > case S_IFCHR: > ______________________________________________________ Linux MTD discussion mailing list http://lists.infradead.org/mailman/listinfo/linux-mtd/ ^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH v4 2/2] ubifs: use strscpy() and kmemdup_nul() where appropriate 2026-04-10 1:06 ` Zhihao Cheng @ 2026-04-10 5:57 ` Richard Weinberger 0 siblings, 0 replies; 12+ messages in thread From: Richard Weinberger @ 2026-04-10 5:57 UTC (permalink / raw) To: chengzhihao1, Dmitry Antipov; +Cc: linux-mtd ----- Ursprüngliche Mail ----- > Von: "chengzhihao1" <chengzhihao1@huawei.com> > An: "Dmitry Antipov" <dmantipov@yandex.ru> > CC: "richard" <richard@nod.at>, "linux-mtd" <linux-mtd@lists.infradead.org> > Gesendet: Freitag, 10. April 2026 03:06:39 > Betreff: Re: [PATCH v4 2/2] ubifs: use strscpy() and kmemdup_nul() where appropriate > 在 2026/4/9 12:56, Dmitry Antipov 写道: >> Go closer to the modern kernel API and use 'strscpy()' and 'kmemdup_nul()' >> over an ad-hoc ensure-to-have-'\0' quirks where appropriate. >> >> Signed-off-by: Dmitry Antipov <dmantipov@yandex.ru> Dmitry, how are you testing these changes? Thanks, //richard ______________________________________________________ Linux MTD discussion mailing list http://lists.infradead.org/mailman/listinfo/linux-mtd/ ^ permalink raw reply [flat|nested] 12+ messages in thread
end of thread, other threads:[~2026-04-10 5:57 UTC | newest] Thread overview: 12+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2026-04-02 8:13 [PATCH] ubifs: prefer kstrtobool_from_user() over custom helper Dmitry Antipov 2026-04-02 11:18 ` Zhihao Cheng 2026-04-03 16:37 ` [PATCH v2 1/2] " Dmitry Antipov 2026-04-03 16:37 ` [PATCH v2 2/2] ubifs: use strscpy() and kmemdup_nul() where appropriate Dmitry Antipov 2026-04-07 2:37 ` Zhihao Cheng 2026-04-07 16:05 ` [PATCH v3 1/2] ubifs: prefer kstrtobool_from_user() over custom helper Dmitry Antipov 2026-04-07 16:05 ` [PATCH v3 2/2] ubifs: use strscpy() and kmemdup_nul() where appropriate Dmitry Antipov 2026-04-08 6:09 ` Zhihao Cheng 2026-04-09 4:56 ` [PATCH v4 1/2] ubifs: prefer kstrtobool_from_user() over custom helper Dmitry Antipov 2026-04-09 4:56 ` [PATCH v4 2/2] ubifs: use strscpy() and kmemdup_nul() where appropriate Dmitry Antipov 2026-04-10 1:06 ` Zhihao Cheng 2026-04-10 5:57 ` Richard Weinberger
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox