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

Commit 4fe9e963 authored by Sachin Prabhu's avatar Sachin Prabhu Committed by Steve French
Browse files

Cleanup handling of NULL value passed for a mount option



Allow blank user= and ip= mount option. Also clean up redundant
checks for NULL values since the token parser will not actually
match mount options with NULL values unless explicitly specified.

Signed-off-by: default avatarSachin Prabhu <sprabhu@redhat.com>
Reported-by: default avatarChris Clayton <chris2553@googlemail.com>
Acked-by: default avatarJeff Layton <jlayton@samba.org>
Tested-by: default avatarChris Clayton <chris2553@googlemail.com>
Signed-off-by: default avatarSteve French <sfrench@us.ibm.com>
parent f68e556e
Loading
Loading
Loading
Loading
+19 −61
Original line number Diff line number Diff line
@@ -109,6 +109,8 @@ enum {

	/* Options which could be blank */
	Opt_blank_pass,
	Opt_blank_user,
	Opt_blank_ip,

	Opt_err
};
@@ -183,11 +185,15 @@ static const match_table_t cifs_mount_option_tokens = {
	{ Opt_wsize, "wsize=%s" },
	{ Opt_actimeo, "actimeo=%s" },

	{ Opt_blank_user, "user=" },
	{ Opt_blank_user, "username=" },
	{ Opt_user, "user=%s" },
	{ Opt_user, "username=%s" },
	{ Opt_blank_pass, "pass=" },
	{ Opt_pass, "pass=%s" },
	{ Opt_pass, "password=%s" },
	{ Opt_blank_ip, "ip=" },
	{ Opt_blank_ip, "addr=" },
	{ Opt_ip, "ip=%s" },
	{ Opt_ip, "addr=%s" },
	{ Opt_unc, "unc=%s" },
@@ -1534,15 +1540,17 @@ cifs_parse_mount_options(const char *mountdata, const char *devname,

		/* String Arguments */

		case Opt_blank_user:
			/* null user, ie. anonymous authentication */
			vol->nullauth = 1;
			vol->username = NULL;
			break;
		case Opt_user:
			string = match_strdup(args);
			if (string == NULL)
				goto out_nomem;

			if (!*string) {
				/* null user, ie. anonymous authentication */
				vol->nullauth = 1;
			} else if (strnlen(string, MAX_USERNAME_SIZE) >
			if (strnlen(string, MAX_USERNAME_SIZE) >
							MAX_USERNAME_SIZE) {
				printk(KERN_WARNING "CIFS: username too long\n");
				goto cifs_parse_mount_err;
@@ -1611,14 +1619,15 @@ cifs_parse_mount_options(const char *mountdata, const char *devname,
			}
			vol->password[j] = '\0';
			break;
		case Opt_blank_ip:
			vol->UNCip = NULL;
			break;
		case Opt_ip:
			string = match_strdup(args);
			if (string == NULL)
				goto out_nomem;

			if (!*string) {
				vol->UNCip = NULL;
			} else if (strnlen(string, INET6_ADDRSTRLEN) >
			if (strnlen(string, INET6_ADDRSTRLEN) >
						INET6_ADDRSTRLEN) {
				printk(KERN_WARNING "CIFS: ip address "
						    "too long\n");
@@ -1636,12 +1645,6 @@ cifs_parse_mount_options(const char *mountdata, const char *devname,
			if (string == NULL)
				goto out_nomem;

			if (!*string) {
				printk(KERN_WARNING "CIFS: invalid path to "
						    "network resource\n");
				goto cifs_parse_mount_err;
			}

			temp_len = strnlen(string, 300);
			if (temp_len  == 300) {
				printk(KERN_WARNING "CIFS: UNC name too long\n");
@@ -1670,11 +1673,7 @@ cifs_parse_mount_options(const char *mountdata, const char *devname,
			if (string == NULL)
				goto out_nomem;

			if (!*string) {
				printk(KERN_WARNING "CIFS: invalid domain"
						    " name\n");
				goto cifs_parse_mount_err;
			} else if (strnlen(string, 256) == 256) {
			if (strnlen(string, 256) == 256) {
				printk(KERN_WARNING "CIFS: domain name too"
						    " long\n");
				goto cifs_parse_mount_err;
@@ -1693,11 +1692,7 @@ cifs_parse_mount_options(const char *mountdata, const char *devname,
			if (string == NULL)
				goto out_nomem;

			if (!*string) {
				printk(KERN_WARNING "CIFS: srcaddr value not"
						    " specified\n");
				goto cifs_parse_mount_err;
			} else if (!cifs_convert_address(
			if (!cifs_convert_address(
					(struct sockaddr *)&vol->srcaddr,
					string, strlen(string))) {
				printk(KERN_WARNING "CIFS:  Could not parse"
@@ -1710,11 +1705,6 @@ cifs_parse_mount_options(const char *mountdata, const char *devname,
			if (string == NULL)
				goto out_nomem;

			if (!*string) {
				printk(KERN_WARNING "CIFS: Invalid path"
						    " prefix\n");
				goto cifs_parse_mount_err;
			}
			temp_len = strnlen(string, 1024);
			if (string[0] != '/')
				temp_len++; /* missing leading slash */
@@ -1742,11 +1732,7 @@ cifs_parse_mount_options(const char *mountdata, const char *devname,
			if (string == NULL)
				goto out_nomem;

			if (!*string) {
				printk(KERN_WARNING "CIFS: Invalid iocharset"
						    " specified\n");
				goto cifs_parse_mount_err;
			} else if (strnlen(string, 1024) >= 65) {
			if (strnlen(string, 1024) >= 65) {
				printk(KERN_WARNING "CIFS: iocharset name "
						    "too long.\n");
				goto cifs_parse_mount_err;
@@ -1771,11 +1757,6 @@ cifs_parse_mount_options(const char *mountdata, const char *devname,
			if (string == NULL)
				goto out_nomem;

			if (!*string) {
				printk(KERN_WARNING "CIFS: No socket option"
						    " specified\n");
				goto cifs_parse_mount_err;
			}
			if (strnicmp(string, "TCP_NODELAY", 11) == 0)
				vol->sockopt_tcp_nodelay = 1;
			break;
@@ -1784,12 +1765,6 @@ cifs_parse_mount_options(const char *mountdata, const char *devname,
			if (string == NULL)
				goto out_nomem;

			if (!*string) {
				printk(KERN_WARNING "CIFS: Invalid (empty)"
						    " netbiosname\n");
				break;
			}

			memset(vol->source_rfc1001_name, 0x20,
				RFC1001_NAME_LEN);
			/*
@@ -1817,11 +1792,6 @@ cifs_parse_mount_options(const char *mountdata, const char *devname,
			if (string == NULL)
				goto out_nomem;

			if (!*string) {
				printk(KERN_WARNING "CIFS: Empty server"
					" netbiosname specified\n");
				break;
			}
			/* last byte, type, is 0x20 for servr type */
			memset(vol->target_rfc1001_name, 0x20,
				RFC1001_NAME_LEN_WITH_NULL);
@@ -1848,12 +1818,6 @@ cifs_parse_mount_options(const char *mountdata, const char *devname,
			if (string == NULL)
				goto out_nomem;

			if (!*string) {
				cERROR(1, "no protocol version specified"
					  " after vers= mount option");
				goto cifs_parse_mount_err;
			}

			if (strnicmp(string, "cifs", 4) == 0 ||
			    strnicmp(string, "1", 1) == 0) {
				/* This is the default */
@@ -1868,12 +1832,6 @@ cifs_parse_mount_options(const char *mountdata, const char *devname,
			if (string == NULL)
				goto out_nomem;

			if (!*string) {
				printk(KERN_WARNING "CIFS: no security flavor"
						    " specified\n");
				break;
			}

			if (cifs_parse_security_flavors(string, vol) != 0)
				goto cifs_parse_mount_err;
			break;