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

Commit 9412b927 authored by Chuck Lever's avatar Chuck Lever Committed by Trond Myklebust
Browse files

NFS: Refactor mount option address parsing into separate function



Refactor the logic to parse incoming text-based IP addresses.  Use the
in4_pton() function instead of the older in_aton(), following the lead
of the in-kernel CIFS client.

Later we'll add IPv6 address parsing using the matching in6_pton()
function.  For now we can't allow IPv6 address parsing: we must expand
the size of the address storage fields in the nfs_parsed_mount_options
struct before we can parse and store IPv6 addresses.

Signed-off-by: default avatarChuck Lever <chuck.lever@oracle.com>
Cc: Aurelien Charbon <aurelien.charbon@ext.bull.net>
Signed-off-by: default avatarTrond Myklebust <Trond.Myklebust@netapp.com>
parent 33832034
Loading
Loading
Loading
Loading
+24 −6
Original line number Diff line number Diff line
@@ -640,6 +640,26 @@ static int nfs_verify_server_address(struct sockaddr *addr)
	return 0;
}

/*
 * Parse string addresses passed in via a mount option,
 * and construct a sockaddr based on the result.
 *
 * If address parsing fails, set the sockaddr's address
 * family to AF_UNSPEC to force nfs_verify_server_address()
 * to punt the mount.
 */
static void nfs_parse_server_address(char *value,
				     struct sockaddr *sap)
{
	struct sockaddr_in *ap = (void *)sap;

	ap->sin_family = AF_INET;
	if (in4_pton(value, -1, (u8 *)&ap->sin_addr.s_addr, '\0', NULL))
		return;

	sap->sa_family = AF_UNSPEC;
}

/*
 * Error-check and convert a string of mount options from user space into
 * a data structure
@@ -963,9 +983,8 @@ static int nfs_parse_mount_options(char *raw,
			string = match_strdup(args);
			if (string == NULL)
				goto out_nomem;
			mnt->nfs_server.address.sin_family = AF_INET;
			mnt->nfs_server.address.sin_addr.s_addr =
							in_aton(string);
			nfs_parse_server_address(string, (struct sockaddr *)
						 &mnt->nfs_server.address);
			kfree(string);
			break;
		case Opt_clientaddr:
@@ -984,9 +1003,8 @@ static int nfs_parse_mount_options(char *raw,
			string = match_strdup(args);
			if (string == NULL)
				goto out_nomem;
			mnt->mount_server.address.sin_family = AF_INET;
			mnt->mount_server.address.sin_addr.s_addr =
							in_aton(string);
			nfs_parse_server_address(string, (struct sockaddr *)
						 &mnt->mount_server.address);
			kfree(string);
			break;