From: Eric Anderle <eanderle@xxxxxxxxx> We should catch errors in the format at the time the list is given to the kernel, rather than just returning garbage to the client and letting the client fail. Signed-off-by: J. Bruce Fields <bfields@xxxxxxxxxxxxxx> --- fs/nfsd/nfs4pnfsdlm.c | 29 +++++++++++++++++++++++------ 1 files changed, 23 insertions(+), 6 deletions(-) diff --git a/fs/nfsd/nfs4pnfsdlm.c b/fs/nfsd/nfs4pnfsdlm.c index 1cf1b69..b6d9f23 100644 --- a/fs/nfsd/nfs4pnfsdlm.c +++ b/fs/nfsd/nfs4pnfsdlm.c @@ -26,6 +26,7 @@ #include <linux/nfsd/debug.h> #include <linux/nfsd/nfs4pnfsdlm.h> #include <linux/nfsd/nfs4layoutxdr.h> +#include <linux/sunrpc/clnt.h> #include "nfsfh.h" #include "nfsd.h" @@ -87,6 +88,24 @@ out: return ret; } +bool nfsd4_validate_pnfs_dlm_device(char *ds_list, int len, int *num_ds) +{ + char *start = ds_list; + + *num_ds = 0; + + while (*start) { + struct sockaddr_storage tempAddr; + int ipLen = strcspn(start, ","); + + if (!rpc_pton(start, ipLen, (struct sockaddr *)&tempAddr, sizeof(tempAddr))) + return false; + (*num_ds)++; + start += ipLen + 1; + } + return true; +} + /* * pnfs_dlm_device string format: * block-device-path:<ds1 ipv4 address>,<ds2 ipv4 address> @@ -140,12 +159,10 @@ nfsd4_set_pnfs_dlm_device(char *pnfs_dlm_device, int len) goto out_free; memcpy(new->ds_list, bufp, len); - /* count the number of comma-delimited DS IPs */ - new->num_ds = 1; - while ((bufp = strchr(bufp, ',')) != NULL) { - new->num_ds++; - bufp++; - } + + /* validate the ips */ + if (!nfsd4_validate_pnfs_dlm_device(new->ds_list, len, &(new->num_ds))) + goto out_free; dprintk("%s disk_name %s num_ds %d ds_list %s\n", __func__, new->disk_name, new->num_ds, new->ds_list); -- 1.7.0.4 -- To unsubscribe from this list: send the line "unsubscribe linux-nfs" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html