diff -urN linux-2.4.27-pre3/fs/nfs/nfs2xdr.c linux-2.4.27-pre3-nfs-symlink/fs/nfs/nfs2xdr.c --- linux-2.4.27-pre3/fs/nfs/nfs2xdr.c Tue Jan 7 15:50:41 2003 +++ linux-2.4.27-pre3-nfs-symlink/fs/nfs/nfs2xdr.c Fri May 21 00:33:39 2004 @@ -571,8 +571,11 @@ strlen = (u32*)kmap(rcvbuf->pages[0]); /* Convert length of symlink */ len = ntohl(*strlen); - if (len > rcvbuf->page_len) - len = rcvbuf->page_len; + if (len > PAGE_CACHE_SIZE - 5) { + 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); diff -urN linux-2.4.27-pre3/fs/nfs/nfs3xdr.c linux-2.4.27-pre3-nfs-symlink/fs/nfs/nfs3xdr.c --- linux-2.4.27-pre3/fs/nfs/nfs3xdr.c Thu Oct 23 10:11:36 2003 +++ linux-2.4.27-pre3-nfs-symlink/fs/nfs/nfs3xdr.c Fri May 21 00:32:44 2004 @@ -759,8 +759,11 @@ strlen = (u32*)kmap(rcvbuf->pages[0]); /* Convert length of symlink */ len = ntohl(*strlen); - if (len > rcvbuf->page_len) - len = rcvbuf->page_len; + if (len > PAGE_CACHE_SIZE - 5) { + 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);