Use safe string copying macros (strscpy & strscpy_pad) to make string copying simpler & safer.
Signed-off-by: Integral <[email protected]> --- fs/bcachefs/dirent.c | 10 +++------- fs/bcachefs/disk_groups.c | 5 ++--- fs/bcachefs/fs-ioctl.c | 17 ++++++++--------- fs/bcachefs/fs.c | 6 +----- 4 files changed, 14 insertions(+), 24 deletions(-) diff --git a/fs/bcachefs/dirent.c b/fs/bcachefs/dirent.c index 600eee936f13..8bc6696115c0 100644 --- a/fs/bcachefs/dirent.c +++ b/fs/bcachefs/dirent.c @@ -191,13 +191,9 @@ static struct bkey_i_dirent *dirent_create_key(struct btree_trans *trans, dirent->v.d_type = type; - memcpy(dirent->v.d_name, name->name, name->len); - memset(dirent->v.d_name + name->len, 0, - bkey_val_bytes(&dirent->k) - - offsetof(struct bch_dirent, d_name) - - name->len); - - EBUG_ON(bch2_dirent_name_bytes(dirent_i_to_s_c(dirent)) != name->len); + EBUG_ON(strscpy_pad(dirent->v.d_name, name->name, + bkey_val_bytes(&dirent->k) - offsetof(struct bch_dirent, d_name)) + != name->len); return dirent; } diff --git a/fs/bcachefs/disk_groups.c b/fs/bcachefs/disk_groups.c index 5df8de0b8c02..c2fc575e38d1 100644 --- a/fs/bcachefs/disk_groups.c +++ b/fs/bcachefs/disk_groups.c @@ -319,9 +319,8 @@ static int __bch2_disk_group_add(struct bch_sb_handle *sb, unsigned parent, g = &groups->entries[i]; - memcpy(g->label, name, namelen); - if (namelen < sizeof(g->label)) - g->label[namelen] = '\0'; + strscpy(g->label, name, namelen); + SET_BCH_GROUP_DELETED(g, 0); SET_BCH_GROUP_PARENT(g, parent); SET_BCH_GROUP_DATA_ALLOWED(g, ~0); diff --git a/fs/bcachefs/fs-ioctl.c b/fs/bcachefs/fs-ioctl.c index 15725b4ce393..4233707bec9d 100644 --- a/fs/bcachefs/fs-ioctl.c +++ b/fs/bcachefs/fs-ioctl.c @@ -279,26 +279,25 @@ static int bch2_ioc_getversion(struct bch_inode_info *inode, u32 __user *arg) static int bch2_ioc_getlabel(struct bch_fs *c, char __user *user_label) { - int ret; - size_t len; char label[BCH_SB_LABEL_SIZE]; + size_t len; BUILD_BUG_ON(BCH_SB_LABEL_SIZE >= FSLABEL_MAX); mutex_lock(&c->sb_lock); - memcpy(label, c->disk_sb.sb->label, BCH_SB_LABEL_SIZE); + int ret = strscpy(label, c->disk_sb.sb->label, BCH_SB_LABEL_SIZE); mutex_unlock(&c->sb_lock); - len = strnlen(label, BCH_SB_LABEL_SIZE); - if (len == BCH_SB_LABEL_SIZE) { + if (ret == -E2BIG) { + len = BCH_SB_LABEL_SIZE - 1; bch_warn(c, "label is too long, return the first %zu bytes", - --len); + len); + } else { + len = ret; } - ret = copy_to_user(user_label, label, len); - - return ret ? -EFAULT : 0; + return copy_to_user(user_label, label, len) ? -EFAULT : 0; } static int bch2_ioc_setlabel(struct bch_fs *c, diff --git a/fs/bcachefs/fs.c b/fs/bcachefs/fs.c index 3f83f131d0e8..b553dae38e80 100644 --- a/fs/bcachefs/fs.c +++ b/fs/bcachefs/fs.c @@ -1656,7 +1656,6 @@ static int bch2_get_name(struct dentry *parent, char *name, struct dentry *child subvol_inum target; u32 snapshot; struct qstr dirent_name; - unsigned name_len = 0; int ret; if (!S_ISDIR(dir->v.i_mode)) @@ -1732,10 +1731,7 @@ static int bch2_get_name(struct dentry *parent, char *name, struct dentry *child goto err; found: dirent_name = bch2_dirent_get_name(d); - - name_len = min_t(unsigned, dirent_name.len, NAME_MAX); - memcpy(name, dirent_name.name, name_len); - name[name_len] = '\0'; + strscpy(name, dirent_name.name, NAME_MAX); err: if (bch2_err_matches(ret, BCH_ERR_transaction_restart)) goto retry; -- 2.47.1
