From: Cyrill Gorcunov Subject: [PATCH] NFS - fix possible NULL pointer dereference kstrndup and kstrdup may return NULL so we should be ready for a such situation Signed-off-by: Cyrill Gorcunov --- --- a/fs/nfs/super.c Wed Mar 05 07:33:54 2008 +++ a/fs/nfs/super.c Thu Apr 17 11:10:34 2008 @@ -1211,6 +1211,8 @@ static int nfs_validate_mount_data(void args->nfs_server.protocol = XPRT_TRANSPORT_UDP; /* N.B. caller will free nfs_server.hostname in all cases */ args->nfs_server.hostname = kstrdup(data->hostname, GFP_KERNEL); + if (!args->nfs_server.hostname) + goto out_nomem; args->namlen = data->namlen; args->bsize = data->bsize; args->auth_flavors[0] = data->pseudoflavor; @@ -1233,6 +1235,8 @@ static int nfs_validate_mount_data(void len = c - dev_name; /* N.B. caller will free nfs_server.hostname in all cases */ args->nfs_server.hostname = kstrndup(dev_name, len, GFP_KERNEL); + if (!args->nfs_server.hostname) + goto out_nomem; c++; if (strlen(c) > NFS_MAXPATHLEN) @@ -1280,6 +1284,10 @@ out_no_address: dfprintk(MOUNT, "NFS: mount program didn't pass remote address\n"); return -EINVAL; +out_nomem: + dfprintk(MOUNT, "NFS: not enough memory to duplicate string\n"); + return -ENOMEM; + out_invalid_fh: dfprintk(MOUNT, "NFS: invalid root filehandle\n"); return -EINVAL; @@ -1797,12 +1805,15 @@ static int nfs4_validate_mount_data(void return -ENAMETOOLONG; /* N.B. caller will free nfs_server.hostname in all cases */ args->nfs_server.hostname = kstrndup(dev_name, len, GFP_KERNEL); - + if (!args->nfs_server.hostname) + goto out_nomem; c++; /* step over the ':' */ len = strlen(c); if (len > NFS4_MAXPATHLEN) return -ENAMETOOLONG; args->nfs_server.export_path = kstrndup(c, len, GFP_KERNEL); + if (!args->nfs_server.export_path) + goto out_nomem; dprintk("NFS: MNTPATH: '%s'\n", args->nfs_server.export_path); @@ -1827,6 +1838,10 @@ out_inval_auth: out_no_address: dfprintk(MOUNT, "NFS4: mount program didn't pass remote address\n"); return -EINVAL; + +out_nomem: + dfprintk(MOUNT, "NFS4: not enough memory to duplicate string\n"); + return -ENOMEM; out_no_client_address: dfprintk(MOUNT, "NFS4: mount program didn't pass callback address\n");