Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 8727c8a8 authored by Steve French's avatar Steve French
Browse files

Allow user names longer than 32 bytes



We artificially limited the user name to 32 bytes, but modern servers handle
larger.  Set the maximum length to a reasonable 256, and make the user name
string dynamically allocated rather than a fixed size in session structure.
Also clean up old checkpatch warning.

Signed-off-by: default avatarSteve French <sfrench@us.ibm.com>
parent bdf1b03e
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -113,7 +113,7 @@ cifs_get_spnego_key(struct cifsSesInfo *sesInfo)
		   MAX_MECH_STR_LEN +
		   UID_KEY_LEN + (sizeof(uid_t) * 2) +
		   CREDUID_KEY_LEN + (sizeof(uid_t) * 2) +
		   USER_KEY_LEN + strlen(sesInfo->userName) +
		   USER_KEY_LEN + strlen(sesInfo->user_name) +
		   PID_KEY_LEN + (sizeof(pid_t) * 2) + 1;

	spnego_key = ERR_PTR(-ENOMEM);
@@ -153,7 +153,7 @@ cifs_get_spnego_key(struct cifsSesInfo *sesInfo)
	sprintf(dp, ";creduid=0x%x", sesInfo->cred_uid);

	dp = description + strlen(description);
	sprintf(dp, ";user=%s", sesInfo->userName);
	sprintf(dp, ";user=%s", sesInfo->user_name);

	dp = description + strlen(description);
	sprintf(dp, ";pid=0x%x", current->pid);
+3 −3
Original line number Diff line number Diff line
@@ -469,15 +469,15 @@ static int calc_ntlmv2_hash(struct cifsSesInfo *ses, char *ntlmv2_hash,
		return rc;
	}

	/* convert ses->userName to unicode and uppercase */
	len = strlen(ses->userName);
	/* convert ses->user_name to unicode and uppercase */
	len = strlen(ses->user_name);
	user = kmalloc(2 + (len * 2), GFP_KERNEL);
	if (user == NULL) {
		cERROR(1, "calc_ntlmv2_hash: user mem alloc failure\n");
		rc = -ENOMEM;
		goto calc_exit_2;
	}
	len = cifs_strtoUCS((__le16 *)user, ses->userName, len, nls_cp);
	len = cifs_strtoUCS((__le16 *)user, ses->user_name, len, nls_cp);
	UniStrupr(user);

	crypto_shash_update(&ses->server->secmech.sdeschmacmd5->shash,
+2 −2
Original line number Diff line number Diff line
@@ -412,8 +412,8 @@ cifs_show_options(struct seq_file *s, struct vfsmount *m)

	if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MULTIUSER)
		seq_printf(s, ",multiuser");
	else if (tcon->ses->userName)
		seq_printf(s, ",username=%s", tcon->ses->userName);
	else if (tcon->ses->user_name)
		seq_printf(s, ",username=%s", tcon->ses->user_name);

	if (tcon->ses->domainName)
		seq_printf(s, ",domain=%s", tcon->ses->domainName);
+3 −4
Original line number Diff line number Diff line
@@ -38,8 +38,7 @@
#define MAX_TREE_SIZE (2 + MAX_SERVER_SIZE + 1 + MAX_SHARE_SIZE + 1)
#define MAX_SERVER_SIZE 15
#define MAX_SHARE_SIZE  64	/* used to be 20, this should still be enough */
#define MAX_USERNAME_SIZE 32	/* 32 is to allow for 15 char names + null
				   termination then *2 for unicode versions */
#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
@@ -274,7 +273,7 @@ struct cifsSesInfo {
	int capabilities;
	char serverName[SERVER_NAME_LEN_WITH_NULL * 2];	/* BB make bigger for
				TCP names - will ipv6 and sctp addresses fit? */
	char userName[MAX_USERNAME_SIZE + 1];
	char *user_name;
	char *domainName;
	char *password;
	struct session_key auth_key;
+10 −5
Original line number Diff line number Diff line
@@ -881,7 +881,8 @@ cifs_parse_mount_options(char *options, const char *devname,
				/* null user, ie anonymous, authentication */
				vol->nullauth = 1;
			}
			if (strnlen(value, 200) < 200) {
			if (strnlen(value, MAX_USERNAME_SIZE) <
						MAX_USERNAME_SIZE) {
				vol->username = value;
			} else {
				printk(KERN_WARNING "CIFS: username too long\n");
@@ -1808,7 +1809,9 @@ cifs_find_smb_ses(struct TCP_Server_Info *server, struct smb_vol *vol)
			break;
		default:
			/* anything else takes username/password */
			if (strncmp(ses->userName, vol->username,
			if (ses->user_name == NULL)
				continue;
			if (strncmp(ses->user_name, vol->username,
				    MAX_USERNAME_SIZE))
				continue;
			if (strlen(vol->username) != 0 &&
@@ -1906,9 +1909,11 @@ cifs_get_smb_ses(struct TCP_Server_Info *server, struct smb_vol *volume_info)
	else
		sprintf(ses->serverName, "%pI4", &addr->sin_addr);

	if (volume_info->username)
		strncpy(ses->userName, volume_info->username,
			MAX_USERNAME_SIZE);
	if (volume_info->username) {
		ses->user_name = kstrdup(volume_info->username, GFP_KERNEL);
		if (!ses->user_name)
			goto get_ses_fail;
	}

	/* volume_info->password freed at unmount */
	if (volume_info->password) {
Loading