According at, https://tools.ietf.org/html/draft-ietf-nfsv4-minorversion2-38#section-12.2.4 "The FATTR4_SEC_LABEL contains an array of two components with the first component being an LFS." So, the security label returned from server should be stored in an array. Signed-off-by: Kinglong Mee <kinglongmee@xxxxxxxxx> --- fs/nfs/nfs4xdr.c | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/fs/nfs/nfs4xdr.c b/fs/nfs/nfs4xdr.c index 558cd65d..d8a35d2 100644 --- a/fs/nfs/nfs4xdr.c +++ b/fs/nfs/nfs4xdr.c @@ -4114,17 +4114,21 @@ static int decode_attr_security_label(struct xdr_stream *xdr, uint32_t *bitmap, if (unlikely(bitmap[2] & (FATTR4_WORD2_SECURITY_LABEL - 1U))) return -EIO; if (likely(bitmap[2] & FATTR4_WORD2_SECURITY_LABEL)) { - p = xdr_inline_decode(xdr, 4); + uint32_t dummy; + + p = xdr_inline_decode(xdr, 16); if (unlikely(!p)) goto out_overflow; - lfs = be32_to_cpup(p++); - p = xdr_inline_decode(xdr, 4); - if (unlikely(!p)) + + dummy = be32_to_cpup(p++); + if (dummy != 1) { + printk(KERN_WARNING "%s: More than one labels (%u)!", + __func__, dummy); goto out_overflow; + } + + lfs = be32_to_cpup(p++); pi = be32_to_cpup(p++); - 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)) -- 2.4.3 -- To unsubscribe from this list: send the line "unsubscribe linux-nfs" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html