From: Trond Myklebust Date: Wed, 19 Aug 2009 22:21:52 +0000 (-0400) Subject: Merge branch 'nfsv4_xdr_cleanups-for-2.6.32' into nfs-for-2.6.32 X-Git-Url: https://git.karo-electronics.de/?a=commitdiff_plain;h=6a396f67d2442e30150ffb5e1142dbb2f2181d3f;p=linux-beck.git Merge branch 'nfsv4_xdr_cleanups-for-2.6.32' into nfs-for-2.6.32 Conflicts: fs/nfs/nfs4xdr.c --- 6a396f67d2442e30150ffb5e1142dbb2f2181d3f diff --cc fs/nfs/nfs4xdr.c index e65cc2e650c8,14b6f513648f..cfc30d362f94 --- a/fs/nfs/nfs4xdr.c +++ b/fs/nfs/nfs4xdr.c @@@ -3073,10 -3143,12 +3143,13 @@@ static int decode_attr_nlink(struct xdr } dprintk("%s: nlink=%u\n", __func__, (unsigned int)*nlink); return ret; + out_overflow: + print_overflow_msg(__func__, xdr); + return -EIO; } -static int decode_attr_owner(struct xdr_stream *xdr, uint32_t *bitmap, struct nfs_client *clp, uint32_t *uid) +static int decode_attr_owner(struct xdr_stream *xdr, uint32_t *bitmap, + struct nfs_client *clp, uint32_t *uid, int may_sleep) { uint32_t len; __be32 *p; @@@ -3086,12 -3158,14 +3159,16 @@@ if (unlikely(bitmap[1] & (FATTR4_WORD1_OWNER - 1U))) return -EIO; if (likely(bitmap[1] & FATTR4_WORD1_OWNER)) { - READ_BUF(4); - READ32(len); - READ_BUF(len); + p = xdr_inline_decode(xdr, 4); + if (unlikely(!p)) + goto out_overflow; + len = be32_to_cpup(p); + p = xdr_inline_decode(xdr, len); + if (unlikely(!p)) + goto out_overflow; - if (len < XDR_MAX_NETOBJ) { + if (!may_sleep) { + /* do nothing */ + } else if (len < XDR_MAX_NETOBJ) { if (nfs_map_name_to_uid(clp, (char *)p, len, uid) == 0) ret = NFS_ATTR_FATTR_OWNER; else @@@ -3104,10 -3178,12 +3181,13 @@@ } dprintk("%s: uid=%d\n", __func__, (int)*uid); return ret; + out_overflow: + print_overflow_msg(__func__, xdr); + return -EIO; } -static int decode_attr_group(struct xdr_stream *xdr, uint32_t *bitmap, struct nfs_client *clp, uint32_t *gid) +static int decode_attr_group(struct xdr_stream *xdr, uint32_t *bitmap, + struct nfs_client *clp, uint32_t *gid, int may_sleep) { uint32_t len; __be32 *p; @@@ -3117,12 -3193,14 +3197,16 @@@ if (unlikely(bitmap[1] & (FATTR4_WORD1_OWNER_GROUP - 1U))) return -EIO; if (likely(bitmap[1] & FATTR4_WORD1_OWNER_GROUP)) { - READ_BUF(4); - READ32(len); - READ_BUF(len); + p = xdr_inline_decode(xdr, 4); + if (unlikely(!p)) + goto out_overflow; + len = be32_to_cpup(p); + p = xdr_inline_decode(xdr, len); + if (unlikely(!p)) + goto out_overflow; - if (len < XDR_MAX_NETOBJ) { + if (!may_sleep) { + /* do nothing */ + } else if (len < XDR_MAX_NETOBJ) { if (nfs_map_group_to_gid(clp, (char *)p, len, gid) == 0) ret = NFS_ATTR_FATTR_GROUP; else