OSDN Git Service

[PATCH] nfs client: handle long symlinks properly
authorAssar <assar@permabit.com>
Wed, 14 Sep 2005 20:59:25 +0000 (16:59 -0400)
committerMarcelo Tosatti <marcelo@dmt.cnet>
Thu, 22 Sep 2005 16:11:18 +0000 (13:11 -0300)
In 2.4.31, the v2/3 nfs readlink accepts too long symlinks.
I have tested this by having a server return long symlinks.

diff -u linux-2.4.31.orig/fs/nfs/nfs2xdr.c linux-2.4.31/fs/nfs/nfs2xdr.c

fs/nfs/nfs2xdr.c
fs/nfs/nfs3xdr.c

index 19f2f28..b4394fe 100644 (file)
@@ -571,8 +571,11 @@ nfs_xdr_readlinkres(struct rpc_rqst *req, u32 *p, void *dummy)
        strlen = (u32*)kmap(rcvbuf->pages[0]);
        /* Convert length of symlink */
        len = ntohl(*strlen);
-       if (len > rcvbuf->page_len)
-               len = rcvbuf->page_len;
+       if (len >= rcvbuf->page_len - sizeof(u32) || len > NFS2_MAXPATHLEN) {
+               printk(KERN_WARNING "NFS: server returned giant symlink!\n");
+               kunmap(rcvbuf->pages[0]);
+               return -ENAMETOOLONG;
+        }
        *strlen = len;
        /* NULL terminate the string we got */
        string = (char *)(strlen + 1);
index 5606222..d586c79 100644 (file)
@@ -759,8 +759,11 @@ nfs3_xdr_readlinkres(struct rpc_rqst *req, u32 *p, struct nfs_fattr *fattr)
        strlen = (u32*)kmap(rcvbuf->pages[0]);
        /* Convert length of symlink */
        len = ntohl(*strlen);
-       if (len > rcvbuf->page_len)
-               len = rcvbuf->page_len;
+       if (len >= rcvbuf->page_len - sizeof(u32)) {
+               printk(KERN_WARNING "NFS: server returned giant symlink!\n");
+               kunmap(rcvbuf->pages[0]);
+               return -ENAMETOOLONG;
+        }
        *strlen = len;
        /* NULL terminate the string we got */
        string = (char *)(strlen + 1);