]> git.karo-electronics.de Git - mv-sheeva.git/commitdiff
NFSv4: Clean up nfs4_decode_dirent
authorTrond Myklebust <Trond.Myklebust@netapp.com>
Sun, 24 Oct 2010 15:52:55 +0000 (11:52 -0400)
committerTrond Myklebust <Trond.Myklebust@netapp.com>
Sun, 24 Oct 2010 17:18:04 +0000 (13:18 -0400)
Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
fs/nfs/nfs4xdr.c

index 9bf5e66d11db8f7128b62420fd9eead7bf2aafda..4c43e4874c5245081eb501cbd065bebd12e4fc95 100644 (file)
@@ -5803,11 +5803,10 @@ __be32 *nfs4_decode_dirent(struct xdr_stream *xdr, struct nfs_entry *entry,
        p = xdr_decode_hyper(p, &entry->cookie);
        entry->len = ntohl(*p++);
 
-       p = xdr_inline_decode(xdr, entry->len + 4);
+       p = xdr_inline_decode(xdr, entry->len);
        if (unlikely(!p))
                goto out_overflow;
        entry->name = (const char *) p;
-       p += XDR_QUADLEN(entry->len);
 
        /*
         * In case the server doesn't return an inode number,
@@ -5817,30 +5816,19 @@ __be32 *nfs4_decode_dirent(struct xdr_stream *xdr, struct nfs_entry *entry,
        entry->ino = 1;
        entry->fattr->valid = 0;
 
-       len = ntohl(*p++);              /* bitmap length */
-       if (len-- > 0) {
-               p = xdr_inline_decode(xdr, 4);
-               if (unlikely(!p))
-                       goto out_overflow;
-               bitmap[0] = ntohl(*p++);
-               if (len-- > 0) {
-                       p = xdr_inline_decode(xdr, 4);
-                       if (unlikely(!p))
-                               goto out_overflow;
-                       bitmap[1] = ntohl(*p++);
-                       p += len;
-               }
-       }
-       p = xdr_inline_decode(xdr, 4);
-       if (unlikely(!p))
+       if (decode_attr_bitmap(xdr, bitmap) < 0)
+               goto out_overflow;
+
+       if (decode_attr_length(xdr, &len, &p) < 0)
+               goto out_overflow;
+
+       if (decode_getfattr_attrs(xdr, bitmap, entry->fattr, entry->fh, server, 1) < 0)
+               goto out_overflow;
+       if (entry->fattr->valid & NFS_ATTR_FATTR_FILEID)
+               entry->ino = entry->fattr->fileid;
+
+       if (verify_attr_len(xdr, p, len) < 0)
                goto out_overflow;
-       len = XDR_QUADLEN(ntohl(*p++)); /* attribute buffer length */
-       if (len > 0) {
-               if (decode_getfattr_attrs(xdr, bitmap, entry->fattr, entry->fh, server, 1) < 0)
-                       goto out_overflow;
-               if (entry->fattr->valid & NFS_ATTR_FATTR_FILEID)
-                       entry->ino = entry->fattr->fileid;
-       }
 
        p = xdr_inline_peek(xdr, 8);
        if (p != NULL)