From 252005de0b5900890cdd3cb99bc8d06c9955ae41 Mon Sep 17 00:00:00 2001 From: Chuck Lever Date: Mon, 10 Dec 2007 14:59:21 -0500 Subject: [PATCH] --- yaml --- r: 79643 b: refs/heads/master c: 9412b92772c1d80ea8284583b6aad0260e13515f h: refs/heads/master i: 79641: 3125e3a0c51e4adbcdcf240536e5778377b42d9a 79639: 9f0ae8dcaecd57dd13dd011b3588b5ec5acd7cb1 v: v3 --- [refs] | 2 +- trunk/fs/nfs/super.c | 30 ++++++++++++++++++++++++------ 2 files changed, 25 insertions(+), 7 deletions(-) diff --git a/[refs] b/[refs] index 299fc2f74ce5..76b164870bb2 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 338320345b40eb7c63592f40d25cbd58ccf99548 +refs/heads/master: 9412b92772c1d80ea8284583b6aad0260e13515f diff --git a/trunk/fs/nfs/super.c b/trunk/fs/nfs/super.c index f120be43d543..041fe9e9b74d 100644 --- a/trunk/fs/nfs/super.c +++ b/trunk/fs/nfs/super.c @@ -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;