[PATCH 1/2] cifs: Move string length definitions to uapi

Jeff Layton jlayton at redhat.com
Thu Jul 25 11:55:58 MDT 2013


On Thu, 25 Jul 2013 13:35:20 -0400
scott.lovenberg at gmail.com wrote:

> From: Scott Lovenberg <scott.lovenberg at gmail.com>
> 
> The string lengths for username, domainname, password and share have
> been moved into their own header file in uapi so the mount helper can
> use autoconf to define the size of the string lengths instead of
> trying to keep the two in sync manually.  The names have also been
> changed to be more easily understood, using the "CIFS" prefix and "LEN"
> suffix rather than "SIZE" which could be confusing.
> 
> Signed-off-by: Scott Lovenberg <scott.lovenberg at gmail.com>
> ---
>  fs/cifs/AUTHORS                      |  2 ++
>  fs/cifs/cifsencrypt.c                |  2 +-
>  fs/cifs/cifsglob.h                   |  7 ++-----
>  fs/cifs/connect.c                    | 20 ++++++++++----------
>  fs/cifs/sess.c                       | 16 ++++++++--------
>  include/uapi/linux/cifs/cifs_mount.h | 25 +++++++++++++++++++++++++
>  6 files changed, 48 insertions(+), 24 deletions(-)
>  create mode 100644 include/uapi/linux/cifs/cifs_mount.h
> 
> diff --git a/fs/cifs/AUTHORS b/fs/cifs/AUTHORS
> index ea940b1..6804e2d 100644
> --- a/fs/cifs/AUTHORS
> +++ b/fs/cifs/AUTHORS
> @@ -39,6 +39,8 @@ Shaggy (Dave Kleikamp) for innumerable small fs suggestions and some good cleanu
>  Gunter Kukkukk (testing and suggestions for support of old servers)
>  Igor Mammedov (DFS support)
>  Jeff Layton (many, many fixes, as well as great work on the cifs Kerberos code)
> +Scott Lovenberg
> +
>  
>  Test case and Bug Report contributors
>  -------------------------------------
> diff --git a/fs/cifs/cifsencrypt.c b/fs/cifs/cifsencrypt.c
> index bb84d7c..194f9cc 100644
> --- a/fs/cifs/cifsencrypt.c
> +++ b/fs/cifs/cifsencrypt.c
> @@ -421,7 +421,7 @@ find_domain_name(struct cifs_ses *ses, const struct nls_table *nls_cp)
>  		if (blobptr + attrsize > blobend)
>  			break;
>  		if (type == NTLMSSP_AV_NB_DOMAIN_NAME) {
> -			if (!attrsize || attrsize >= MAX_DOMAINNAME_SIZE)
> +			if (!attrsize || attrsize >= CIFS_MAX_DOMAINNAME_LEN)
>  				break;
>  			if (!ses->domainName) {
>  				ses->domainName =
> diff --git a/fs/cifs/cifsglob.h b/fs/cifs/cifsglob.h
> index 64bb4c5..b07b122 100644
> --- a/fs/cifs/cifsglob.h
> +++ b/fs/cifs/cifsglob.h
> @@ -28,6 +28,7 @@
>  #include "cifsacl.h"
>  #include <crypto/internal/hash.h>
>  #include <linux/scatterlist.h>
> +#include <uapi/linux/cifs/cifs_mount.h>
>  #ifdef CONFIG_CIFS_SMB2
>  #include "smb2pdu.h"
>  #endif
> @@ -41,12 +42,8 @@
>  #define MAX_SES_INFO 2
>  #define MAX_TCON_INFO 4
>  
> -#define MAX_TREE_SIZE (2 + MAX_SERVER_SIZE + 1 + MAX_SHARE_SIZE + 1)
> +#define MAX_TREE_SIZE (2 + MAX_SERVER_SIZE + 1 + CIFS_MAX_SHARE_LEN + 1)
>  #define MAX_SERVER_SIZE 15
		^^^^^^^
This looks wrong too. IIUC, that should be the max length of the
"server" portion of the field. The fact that MAX_TREE_SIZE is pretty
long is likely what papers over this...

The userland helper uses NI_MAXHOST for this field, but that's not
defined in the kernel. Perhaps this should be given a name like
CIFS_NI_MAXHOST, and expanded to the same size as the mount helper uses
(1025)?

> -#define MAX_SHARE_SIZE 80
> -#define MAX_DOMAINNAME_SIZE 256	/* maximum fully qualified domain name (FQDN) */
> -#define MAX_USERNAME_SIZE 256	/* reasonable maximum for current servers */
> -#define MAX_PASSWORD_SIZE 512	/* max for windows seems to be 256 wide chars */
>  
>  #define CIFS_MIN_RCV_POOL 4
>  
> diff --git a/fs/cifs/connect.c b/fs/cifs/connect.c
> index 3f9dcf7..20ac9d4 100644
> --- a/fs/cifs/connect.c
> +++ b/fs/cifs/connect.c
> @@ -1575,8 +1575,8 @@ cifs_parse_mount_options(const char *mountdata, const char *devname,
>  			if (string == NULL)
>  				goto out_nomem;
>  
> -			if (strnlen(string, MAX_USERNAME_SIZE) >
> -							MAX_USERNAME_SIZE) {
> +			if (strnlen(string, CIFS_MAX_USERNAME_LEN) >
> +							CIFS_MAX_USERNAME_LEN) {
>  				printk(KERN_WARNING "CIFS: username too long\n");
>  				goto cifs_parse_mount_err;
>  			}
> @@ -1675,8 +1675,8 @@ cifs_parse_mount_options(const char *mountdata, const char *devname,
>  			if (string == NULL)
>  				goto out_nomem;
>  
> -			if (strnlen(string, MAX_DOMAINNAME_SIZE)
> -					== MAX_DOMAINNAME_SIZE) {
> +			if (strnlen(string, CIFS_MAX_DOMAINNAME_LEN)
> +					== CIFS_MAX_DOMAINNAME_LEN) {
>  				printk(KERN_WARNING "CIFS: domain name too"
>  						    " long\n");
>  				goto cifs_parse_mount_err;
> @@ -2221,13 +2221,13 @@ static int match_session(struct cifs_ses *ses, struct smb_vol *vol)
>  		/* anything else takes username/password */
>  		if (strncmp(ses->user_name,
>  			    vol->username ? vol->username : "",
> -			    MAX_USERNAME_SIZE))
> +			    CIFS_MAX_USERNAME_LEN))
>  			return 0;
>  		if (strlen(vol->username) != 0 &&
>  		    ses->password != NULL &&
>  		    strncmp(ses->password,
>  			    vol->password ? vol->password : "",
> -			    MAX_PASSWORD_SIZE))
> +			    CIFS_MAX_PASSWORD_LEN))
>  			return 0;
>  	}
>  	return 1;
> @@ -2277,8 +2277,8 @@ cifs_put_smb_ses(struct cifs_ses *ses)
>  
>  #ifdef CONFIG_KEYS
>  
> -/* strlen("cifs:a:") + MAX_DOMAINNAME_SIZE + 1 */
> -#define CIFSCREDS_DESC_SIZE (7 + MAX_DOMAINNAME_SIZE + 1)
> +/* strlen("cifs:a:") + CIFS_MAX_DOMAINNAME_LEN + 1 */
> +#define CIFSCREDS_DESC_SIZE (7 + CIFS_MAX_DOMAINNAME_LEN + 1)
>  
>  /* Populate username and pw fields from keyring if possible */
>  static int
> @@ -2352,7 +2352,7 @@ cifs_set_cifscreds(struct smb_vol *vol, struct cifs_ses *ses)
>  	}
>  
>  	len = delim - payload;
> -	if (len > MAX_USERNAME_SIZE || len <= 0) {
> +	if (len > CIFS_MAX_USERNAME_LEN || len <= 0) {
>  		cifs_dbg(FYI, "Bad value from username search (len=%zd)\n",
>  			 len);
>  		rc = -EINVAL;
> @@ -2369,7 +2369,7 @@ cifs_set_cifscreds(struct smb_vol *vol, struct cifs_ses *ses)
>  	cifs_dbg(FYI, "%s: username=%s\n", __func__, vol->username);
>  
>  	len = key->datalen - (len + 1);
> -	if (len > MAX_PASSWORD_SIZE || len <= 0) {
> +	if (len > CIFS_MAX_PASSWORD_LEN || len <= 0) {
>  		cifs_dbg(FYI, "Bad len for password search (len=%zd)\n", len);
>  		rc = -EINVAL;
>  		kfree(vol->username);
> diff --git a/fs/cifs/sess.c b/fs/cifs/sess.c
> index 57b1537..a0a62db 100644
> --- a/fs/cifs/sess.c
> +++ b/fs/cifs/sess.c
> @@ -197,7 +197,7 @@ static void unicode_domain_string(char **pbcc_area, struct cifs_ses *ses,
>  		bytes_ret = 0;
>  	} else
>  		bytes_ret = cifs_strtoUTF16((__le16 *) bcc_ptr, ses->domainName,
> -					    MAX_DOMAINNAME_SIZE, nls_cp);
> +					    CIFS_MAX_DOMAINNAME_LEN, nls_cp);
>  	bcc_ptr += 2 * bytes_ret;
>  	bcc_ptr += 2;  /* account for null terminator */
>  
> @@ -226,7 +226,7 @@ static void unicode_ssetup_strings(char **pbcc_area, struct cifs_ses *ses,
>  		*(bcc_ptr+1) = 0;
>  	} else {
>  		bytes_ret = cifs_strtoUTF16((__le16 *) bcc_ptr, ses->user_name,
> -					    MAX_USERNAME_SIZE, nls_cp);
> +					    CIFS_MAX_USERNAME_LEN, nls_cp);
>  	}
>  	bcc_ptr += 2 * bytes_ret;
>  	bcc_ptr += 2; /* account for null termination */
> @@ -246,8 +246,8 @@ static void ascii_ssetup_strings(char **pbcc_area, struct cifs_ses *ses,
>  	/* BB what about null user mounts - check that we do this BB */
>  	/* copy user */
>  	if (ses->user_name != NULL) {
> -		strncpy(bcc_ptr, ses->user_name, MAX_USERNAME_SIZE);
> -		bcc_ptr += strnlen(ses->user_name, MAX_USERNAME_SIZE);
> +		strncpy(bcc_ptr, ses->user_name, CIFS_MAX_USERNAME_LEN);
> +		bcc_ptr += strnlen(ses->user_name, CIFS_MAX_USERNAME_LEN);
>  	}
>  	/* else null user mount */
>  	*bcc_ptr = 0;
> @@ -255,8 +255,8 @@ static void ascii_ssetup_strings(char **pbcc_area, struct cifs_ses *ses,
>  
>  	/* copy domain */
>  	if (ses->domainName != NULL) {
> -		strncpy(bcc_ptr, ses->domainName, MAX_DOMAINNAME_SIZE);
> -		bcc_ptr += strnlen(ses->domainName, MAX_DOMAINNAME_SIZE);
> +		strncpy(bcc_ptr, ses->domainName, CIFS_MAX_DOMAINNAME_LEN);
> +		bcc_ptr += strnlen(ses->domainName, CIFS_MAX_DOMAINNAME_LEN);
>  	} /* else we will send a null domain name
>  	     so the server will default to its own domain */
>  	*bcc_ptr = 0;
> @@ -501,7 +501,7 @@ int build_ntlmssp_auth_blob(unsigned char *pbuffer,
>  	} else {
>  		int len;
>  		len = cifs_strtoUTF16((__le16 *)tmp, ses->domainName,
> -				      MAX_USERNAME_SIZE, nls_cp);
> +				      CIFS_MAX_USERNAME_LEN, nls_cp);
>  		len *= 2; /* unicode is 2 bytes each */
>  		sec_blob->DomainName.BufferOffset = cpu_to_le32(tmp - pbuffer);
>  		sec_blob->DomainName.Length = cpu_to_le16(len);
> @@ -517,7 +517,7 @@ int build_ntlmssp_auth_blob(unsigned char *pbuffer,
>  	} else {
>  		int len;
>  		len = cifs_strtoUTF16((__le16 *)tmp, ses->user_name,
> -				      MAX_USERNAME_SIZE, nls_cp);
> +				      CIFS_MAX_USERNAME_LEN, nls_cp);
>  		len *= 2; /* unicode is 2 bytes each */
>  		sec_blob->UserName.BufferOffset = cpu_to_le32(tmp - pbuffer);
>  		sec_blob->UserName.Length = cpu_to_le16(len);
> diff --git a/include/uapi/linux/cifs/cifs_mount.h b/include/uapi/linux/cifs/cifs_mount.h
> new file mode 100644
> index 0000000..1485781
> --- /dev/null
> +++ b/include/uapi/linux/cifs/cifs_mount.h
> @@ -0,0 +1,25 @@
> +/*
> + *   include/uapi/linux/cifs/cifs_mount.h
> + *
> + *   Author(s): Scott Lovenberg (scott.lovenberg at gmail.com)
> + *
> + *   This library is free software; you can redistribute it and/or modify
> + *   it under the terms of the GNU Lesser General Public License as published
> + *   by the Free Software Foundation; either version 2.1 of the License, or
> + *   (at your option) any later version.
> + *
> + *   This library is distributed in the hope that it will be useful,
> + *   but WITHOUT ANY WARRANTY; without even the implied warranty of
> + *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See
> + *   the GNU Lesser General Public License for more details.
> + */
> +#ifndef _CIFS_MOUNT_H
> +#define _CIFS_MOUNT_H
> +
> +/* Max string lengths for cifs mounting options. */
> +#define CIFS_MAX_DOMAINNAME_LEN 256 /* max fully qualified domain name */
> +#define CIFS_MAX_USERNAME_LEN   256 /* reasonable max for current servers */
> +#define CIFS_MAX_PASSWORD_LEN   512 /* Windows max seems to be 256 wide chars */
> +#define CIFS_MAX_SHARE_LEN 80
> +
> +#endif /* _CIFS_MOUNT_H */

...other than the above, this looks reasonable to me.

-- 
Jeff Layton <jlayton at redhat.com>


More information about the samba-technical mailing list