Paulo Alcantara 2296da
From: Al Viro <viro@zeniv.linux.org.uk>
Paulo Alcantara 2296da
Date: Fri, 5 Mar 2021 15:02:34 -0500
Paulo Alcantara 2296da
Subject: [PATCH] cifs: don't cargo-cult strndup()
Paulo Alcantara 2296da
Git-commit: 8d7672235533dbeab4a5373b49f1b4273cdc2c6a
Paulo Alcantara 2296da
References: bsc#1185902
Paulo Alcantara 2296da
Patch-mainline: v5.13-rc1
Paulo Alcantara 2296da
Paulo Alcantara 2296da
strndup(s, strlen(s)) is a highly unidiomatic way to spell strdup(s);
Paulo Alcantara 2296da
it's *NOT* safer in any way, since strlen() is just as sensitive to
Paulo Alcantara 2296da
NUL-termination as strdup() is.
Paulo Alcantara 2296da
Paulo Alcantara 2296da
strndup() is for situations when you need a copy of a known-sized
Paulo Alcantara 2296da
substring, not a magic security juju to drive the bad spirits away.
Paulo Alcantara 2296da
Paulo Alcantara 2296da
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Paulo Alcantara 2296da
Signed-off-by: Steve French <stfrench@microsoft.com>
Paulo Alcantara 2296da
Acked-by: Paulo Alcantara <palcantara@suse.de>
Paulo Alcantara 2296da
---
Paulo Alcantara 2296da
 fs/cifs/cifs_dfs_ref.c |    2 +-
Paulo Alcantara 2296da
 fs/cifs/connect.c      |    8 +++-----
Paulo Alcantara 2296da
 fs/cifs/dfs_cache.c    |   18 +++++++++---------
Paulo Alcantara 2296da
 fs/cifs/misc.c         |    2 +-
Paulo Alcantara 2296da
 fs/cifs/smb1ops.c      |    4 +---
Paulo Alcantara 2296da
 5 files changed, 15 insertions(+), 19 deletions(-)
Paulo Alcantara 2296da
Paulo Alcantara 2296da
--- a/fs/cifs/cifs_dfs_ref.c
Paulo Alcantara 2296da
+++ b/fs/cifs/cifs_dfs_ref.c
Paulo Alcantara 2296da
@@ -272,7 +272,7 @@ static struct vfsmount *cifs_dfs_do_moun
Paulo Alcantara 2296da
 	char *mountdata;
Paulo Alcantara 2296da
 	char *devname;
Paulo Alcantara 2296da
 
Paulo Alcantara 2296da
-	devname = kstrndup(fullpath, strlen(fullpath), GFP_KERNEL);
Paulo Alcantara 2296da
+	devname = kstrdup(fullpath, GFP_KERNEL);
Paulo Alcantara 2296da
 	if (!devname)
Paulo Alcantara 2296da
 		return ERR_PTR(-ENOMEM);
Paulo Alcantara 2296da
 
Paulo Alcantara 2296da
--- a/fs/cifs/connect.c
Paulo Alcantara 2296da
+++ b/fs/cifs/connect.c
Paulo Alcantara 2296da
@@ -3150,9 +3150,7 @@ cifs_set_cifscreds(struct smb_vol *vol,
Paulo Alcantara 2296da
 	 * for the request.
Paulo Alcantara 2296da
 	 */
Paulo Alcantara 2296da
 	if (is_domain && ses->domainName) {
Paulo Alcantara 2296da
-		vol->domainname = kstrndup(ses->domainName,
Paulo Alcantara 2296da
-					   strlen(ses->domainName),
Paulo Alcantara 2296da
-					   GFP_KERNEL);
Paulo Alcantara 2296da
+		vol->domainname = kstrdup(ses->domainName, GFP_KERNEL);
Paulo Alcantara 2296da
 		if (!vol->domainname) {
Paulo Alcantara 2296da
 			cifs_dbg(FYI, "Unable to allocate %zd bytes for "
Paulo Alcantara 2296da
 				 "domain\n", len);
Paulo Alcantara 2296da
@@ -4804,7 +4802,7 @@ int cifs_mount(struct cifs_sb_info *cifs
Paulo Alcantara 2296da
 			goto error;
Paulo Alcantara 2296da
 	}
Paulo Alcantara 2296da
 	/* Save mount options */
Paulo Alcantara 2296da
-	mntdata = kstrndup(cifs_sb->mountdata, strlen(cifs_sb->mountdata), GFP_KERNEL);
Paulo Alcantara 2296da
+	mntdata = kstrdup(cifs_sb->mountdata, GFP_KERNEL);
Paulo Alcantara 2296da
 	if (!mntdata) {
Paulo Alcantara 2296da
 		rc = -ENOMEM;
Paulo Alcantara 2296da
 		goto error;
Paulo Alcantara 2296da
@@ -4877,7 +4875,7 @@ int cifs_mount(struct cifs_sb_info *cifs
Paulo Alcantara 2296da
 	 * links, the prefix path is included in both and may be changed during reconnect.  See
Paulo Alcantara 2296da
 	 * cifs_tree_connect().
Paulo Alcantara 2296da
 	 */
Paulo Alcantara 2296da
-	cifs_sb->origin_fullpath = kstrndup(full_path, strlen(full_path), GFP_KERNEL);
Paulo Alcantara 2296da
+	cifs_sb->origin_fullpath = kstrdup(full_path, GFP_KERNEL);
Paulo Alcantara 2296da
 	if (!cifs_sb->origin_fullpath) {
Paulo Alcantara 2296da
 		rc = -ENOMEM;
Paulo Alcantara 2296da
 		goto error;
Paulo Alcantara 2296da
--- a/fs/cifs/dfs_cache.c
Paulo Alcantara 2296da
+++ b/fs/cifs/dfs_cache.c
Paulo Alcantara 2296da
@@ -87,7 +87,7 @@ static int get_normalized_path(const cha
Paulo Alcantara 2296da
 	if (*path == '\\') {
Paulo Alcantara 2296da
 		*npath = (char *)path;
Paulo Alcantara 2296da
 	} else {
Paulo Alcantara 2296da
-		*npath = kstrndup(path, strlen(path), GFP_KERNEL);
Paulo Alcantara 2296da
+		*npath = kstrdup(path, GFP_KERNEL);
Paulo Alcantara 2296da
 		if (!*npath)
Paulo Alcantara 2296da
 			return -ENOMEM;
Paulo Alcantara 2296da
 		convert_delimiter(*npath, '\\');
Paulo Alcantara 2296da
@@ -354,7 +354,7 @@ static struct cache_dfs_tgt *alloc_targe
Paulo Alcantara 2296da
 	t = kmalloc(sizeof(*t), GFP_ATOMIC);
Paulo Alcantara 2296da
 	if (!t)
Paulo Alcantara 2296da
 		return ERR_PTR(-ENOMEM);
Paulo Alcantara 2296da
-	t->name = kstrndup(name, strlen(name), GFP_ATOMIC);
Paulo Alcantara 2296da
+	t->name = kstrdup(name, GFP_ATOMIC);
Paulo Alcantara 2296da
 	if (!t->name) {
Paulo Alcantara 2296da
 		kfree(t);
Paulo Alcantara 2296da
 		return ERR_PTR(-ENOMEM);
Paulo Alcantara 2296da
@@ -415,7 +415,7 @@ static struct cache_entry *alloc_cache_e
Paulo Alcantara 2296da
 	if (!ce)
Paulo Alcantara 2296da
 		return ERR_PTR(-ENOMEM);
Paulo Alcantara 2296da
 
Paulo Alcantara 2296da
-	ce->path = kstrndup(path, strlen(path), GFP_KERNEL);
Paulo Alcantara 2296da
+	ce->path = kstrdup(path, GFP_KERNEL);
Paulo Alcantara 2296da
 	if (!ce->path) {
Paulo Alcantara 2296da
 		kmem_cache_free(cache_slab, ce);
Paulo Alcantara 2296da
 		return ERR_PTR(-ENOMEM);
Paulo Alcantara 2296da
@@ -527,7 +527,7 @@ static struct cache_entry *lookup_cache_
Paulo Alcantara 2296da
 	char *s, *e;
Paulo Alcantara 2296da
 	char sep;
Paulo Alcantara 2296da
 
Paulo Alcantara 2296da
-	npath = kstrndup(path, strlen(path), GFP_KERNEL);
Paulo Alcantara 2296da
+	npath = kstrdup(path, GFP_KERNEL);
Paulo Alcantara 2296da
 	if (!npath)
Paulo Alcantara 2296da
 		return ERR_PTR(-ENOMEM);
Paulo Alcantara 2296da
 
Paulo Alcantara 2296da
@@ -637,7 +637,7 @@ static int __update_cache_entry(const ch
Paulo Alcantara 2296da
 
Paulo Alcantara 2296da
 	if (ce->tgthint) {
Paulo Alcantara 2296da
 		s = ce->tgthint->name;
Paulo Alcantara 2296da
-		th = kstrndup(s, strlen(s), GFP_ATOMIC);
Paulo Alcantara 2296da
+		th = kstrdup(s, GFP_ATOMIC);
Paulo Alcantara 2296da
 		if (!th)
Paulo Alcantara 2296da
 			return -ENOMEM;
Paulo Alcantara 2296da
 	}
Paulo Alcantara 2296da
@@ -782,11 +782,11 @@ static int setup_referral(const char *pa
Paulo Alcantara 2296da
 
Paulo Alcantara 2296da
 	memset(ref, 0, sizeof(*ref));
Paulo Alcantara 2296da
 
Paulo Alcantara 2296da
-	ref->path_name = kstrndup(path, strlen(path), GFP_ATOMIC);
Paulo Alcantara 2296da
+	ref->path_name = kstrdup(path, GFP_ATOMIC);
Paulo Alcantara 2296da
 	if (!ref->path_name)
Paulo Alcantara 2296da
 		return -ENOMEM;
Paulo Alcantara 2296da
 
Paulo Alcantara 2296da
-	ref->node_name = kstrndup(target, strlen(target), GFP_ATOMIC);
Paulo Alcantara 2296da
+	ref->node_name = kstrdup(target, GFP_ATOMIC);
Paulo Alcantara 2296da
 	if (!ref->node_name) {
Paulo Alcantara 2296da
 		rc = -ENOMEM;
Paulo Alcantara 2296da
 		goto err_free_path;
Paulo Alcantara 2296da
@@ -824,7 +824,7 @@ static int get_targets(struct cache_entr
Paulo Alcantara 2296da
 			goto err_free_it;
Paulo Alcantara 2296da
 		}
Paulo Alcantara 2296da
 
Paulo Alcantara 2296da
-		it->it_name = kstrndup(t->name, strlen(t->name), GFP_ATOMIC);
Paulo Alcantara 2296da
+		it->it_name = kstrdup(t->name, GFP_ATOMIC);
Paulo Alcantara 2296da
 		if (!it->it_name) {
Paulo Alcantara 2296da
 			kfree(it);
Paulo Alcantara 2296da
 			rc = -ENOMEM;
Paulo Alcantara 2296da
@@ -1220,7 +1220,7 @@ int dfs_cache_add_vol(char *mntdata, str
Paulo Alcantara 2296da
 	if (!vi)
Paulo Alcantara 2296da
 		return -ENOMEM;
Paulo Alcantara 2296da
 
Paulo Alcantara 2296da
-	vi->fullpath = kstrndup(fullpath, strlen(fullpath), GFP_KERNEL);
Paulo Alcantara 2296da
+	vi->fullpath = kstrdup(fullpath, GFP_KERNEL);
Paulo Alcantara 2296da
 	if (!vi->fullpath) {
Paulo Alcantara 2296da
 		rc = -ENOMEM;
Paulo Alcantara 2296da
 		goto err_free_vi;
Paulo Alcantara 2296da
--- a/fs/cifs/misc.c
Paulo Alcantara 2296da
+++ b/fs/cifs/misc.c
Paulo Alcantara 2296da
@@ -1182,7 +1182,7 @@ int update_super_prepath(struct cifs_tco
Paulo Alcantara 2296da
 	kfree(cifs_sb->prepath);
Paulo Alcantara 2296da
 
Paulo Alcantara 2296da
 	if (prefix && *prefix) {
Paulo Alcantara 2296da
-		cifs_sb->prepath = kstrndup(prefix, strlen(prefix), GFP_ATOMIC);
Paulo Alcantara 2296da
+		cifs_sb->prepath = kstrdup(prefix, GFP_ATOMIC);
Paulo Alcantara 2296da
 		if (!cifs_sb->prepath) {
Paulo Alcantara 2296da
 			rc = -ENOMEM;
Paulo Alcantara 2296da
 			goto out;
Paulo Alcantara 2296da
--- a/fs/cifs/smb1ops.c
Paulo Alcantara 2296da
+++ b/fs/cifs/smb1ops.c
Paulo Alcantara 2296da
@@ -925,9 +925,7 @@ cifs_unix_dfs_readlink(const unsigned in
Paulo Alcantara 2296da
 			  0);
Paulo Alcantara 2296da
 
Paulo Alcantara 2296da
 	if (!rc) {
Paulo Alcantara 2296da
-		*symlinkinfo = kstrndup(referral.node_name,
Paulo Alcantara 2296da
-					strlen(referral.node_name),
Paulo Alcantara 2296da
-					GFP_KERNEL);
Paulo Alcantara 2296da
+		*symlinkinfo = kstrdup(referral.node_name, GFP_KERNEL);
Paulo Alcantara 2296da
 		free_dfs_info_param(&referral);
Paulo Alcantara 2296da
 		if (!*symlinkinfo)
Paulo Alcantara 2296da
 			rc = -ENOMEM;