cifs: Move string length definitions to uapi

The max string length definitions for user name, domain name, password,
and share name have been moved into their own header file in uapi so the
mount helper can use autoconf to define them instead of keeping the
kernel side and userland side definitions in sync manually.  The names
have also been standardized with a "CIFS" prefix and "LEN" suffix.

Signed-off-by: Scott Lovenberg <scott.lovenberg@gmail.com>
Reviewed-by: Chen Gang <gang.chen@asianux.com>
Signed-off-by: Steve French <smfrench@gmail.com>
This commit is contained in:
Scott Lovenberg 2013-08-09 08:47:17 -04:00 committed by Steve French
parent d244bf2dfb
commit 8c3a2b4c42
4 changed files with 38 additions and 16 deletions

View File

@ -28,6 +28,7 @@
#include "cifsacl.h" #include "cifsacl.h"
#include <crypto/internal/hash.h> #include <crypto/internal/hash.h>
#include <linux/scatterlist.h> #include <linux/scatterlist.h>
#include <uapi/linux/cifs/cifs_mount.h>
#ifdef CONFIG_CIFS_SMB2 #ifdef CONFIG_CIFS_SMB2
#include "smb2pdu.h" #include "smb2pdu.h"
#endif #endif
@ -41,12 +42,8 @@
#define MAX_SES_INFO 2 #define MAX_SES_INFO 2
#define MAX_TCON_INFO 4 #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 #define MAX_SERVER_SIZE 15
#define MAX_SHARE_SIZE 80
#define CIFS_MAX_DOMAINNAME_LEN 256 /* max domain name length */
#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 #define CIFS_MIN_RCV_POOL 4

View File

@ -1577,8 +1577,8 @@ cifs_parse_mount_options(const char *mountdata, const char *devname,
if (string == NULL) if (string == NULL)
goto out_nomem; goto out_nomem;
if (strnlen(string, MAX_USERNAME_SIZE) > if (strnlen(string, CIFS_MAX_USERNAME_LEN) >
MAX_USERNAME_SIZE) { CIFS_MAX_USERNAME_LEN) {
printk(KERN_WARNING "CIFS: username too long\n"); printk(KERN_WARNING "CIFS: username too long\n");
goto cifs_parse_mount_err; goto cifs_parse_mount_err;
} }
@ -2223,13 +2223,13 @@ static int match_session(struct cifs_ses *ses, struct smb_vol *vol)
/* anything else takes username/password */ /* anything else takes username/password */
if (strncmp(ses->user_name, if (strncmp(ses->user_name,
vol->username ? vol->username : "", vol->username ? vol->username : "",
MAX_USERNAME_SIZE)) CIFS_MAX_USERNAME_LEN))
return 0; return 0;
if (strlen(vol->username) != 0 && if (strlen(vol->username) != 0 &&
ses->password != NULL && ses->password != NULL &&
strncmp(ses->password, strncmp(ses->password,
vol->password ? vol->password : "", vol->password ? vol->password : "",
MAX_PASSWORD_SIZE)) CIFS_MAX_PASSWORD_LEN))
return 0; return 0;
} }
return 1; return 1;
@ -2354,7 +2354,7 @@ cifs_set_cifscreds(struct smb_vol *vol, struct cifs_ses *ses)
} }
len = delim - payload; 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", cifs_dbg(FYI, "Bad value from username search (len=%zd)\n",
len); len);
rc = -EINVAL; rc = -EINVAL;
@ -2371,7 +2371,7 @@ cifs_set_cifscreds(struct smb_vol *vol, struct cifs_ses *ses)
cifs_dbg(FYI, "%s: username=%s\n", __func__, vol->username); cifs_dbg(FYI, "%s: username=%s\n", __func__, vol->username);
len = key->datalen - (len + 1); 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); cifs_dbg(FYI, "Bad len for password search (len=%zd)\n", len);
rc = -EINVAL; rc = -EINVAL;
kfree(vol->username); kfree(vol->username);

View File

@ -226,7 +226,7 @@ static void unicode_ssetup_strings(char **pbcc_area, struct cifs_ses *ses,
*(bcc_ptr+1) = 0; *(bcc_ptr+1) = 0;
} else { } else {
bytes_ret = cifs_strtoUTF16((__le16 *) bcc_ptr, ses->user_name, 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 * bytes_ret;
bcc_ptr += 2; /* account for null termination */ 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 */ /* BB what about null user mounts - check that we do this BB */
/* copy user */ /* copy user */
if (ses->user_name != NULL) { if (ses->user_name != NULL) {
strncpy(bcc_ptr, ses->user_name, MAX_USERNAME_SIZE); strncpy(bcc_ptr, ses->user_name, CIFS_MAX_USERNAME_LEN);
bcc_ptr += strnlen(ses->user_name, MAX_USERNAME_SIZE); bcc_ptr += strnlen(ses->user_name, CIFS_MAX_USERNAME_LEN);
} }
/* else null user mount */ /* else null user mount */
*bcc_ptr = 0; *bcc_ptr = 0;
@ -501,7 +501,7 @@ int build_ntlmssp_auth_blob(unsigned char *pbuffer,
} else { } else {
int len; int len;
len = cifs_strtoUTF16((__le16 *)tmp, ses->domainName, 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 */ len *= 2; /* unicode is 2 bytes each */
sec_blob->DomainName.BufferOffset = cpu_to_le32(tmp - pbuffer); sec_blob->DomainName.BufferOffset = cpu_to_le32(tmp - pbuffer);
sec_blob->DomainName.Length = cpu_to_le16(len); sec_blob->DomainName.Length = cpu_to_le16(len);
@ -517,7 +517,7 @@ int build_ntlmssp_auth_blob(unsigned char *pbuffer,
} else { } else {
int len; int len;
len = cifs_strtoUTF16((__le16 *)tmp, ses->user_name, 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 */ len *= 2; /* unicode is 2 bytes each */
sec_blob->UserName.BufferOffset = cpu_to_le32(tmp - pbuffer); sec_blob->UserName.BufferOffset = cpu_to_le32(tmp - pbuffer);
sec_blob->UserName.Length = cpu_to_le16(len); sec_blob->UserName.Length = cpu_to_le16(len);

View File

@ -0,0 +1,25 @@
/*
* include/uapi/linux/cifs/cifs_mount.h
*
* Author(s): Scott Lovenberg (scott.lovenberg@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 */