nfs: fix bitmap decoder to handle a 3rd word
authorJeff Layton <jlayton@kernel.org>
Wed, 21 Aug 2024 12:28:25 +0000 (08:28 -0400)
committerAnna Schumaker <Anna.Schumaker@Netapp.com>
Thu, 22 Aug 2024 21:01:10 +0000 (17:01 -0400)
It only decodes the first two words at this point. Have it decode the
third word as well. Without this, the client doesn't send delegated
timestamps in the CB_GETATTR response.

With this change we also need to expand the on-stack bitmap in
decode_recallany_args to 3 elements, in case the server sends a larger
bitmap than expected.

Fixes: 43df7110f4a9 ("NFSv4: Add CB_GETATTR support for delegated attributes")
Signed-off-by: Jeff Layton <jlayton@kernel.org>
Reviewed-by: Benjamin Coddington <bcodding@redhat.com>
Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com>
fs/nfs/callback_xdr.c

index 29c49a7e5fe1c10aca0b700d47adfa49c8ffbd86..6df77f008d3fada0066275fda0625e6c51368a56 100644 (file)
@@ -118,7 +118,9 @@ static __be32 decode_bitmap(struct xdr_stream *xdr, uint32_t *bitmap)
        if (likely(attrlen > 0))
                bitmap[0] = ntohl(*p++);
        if (attrlen > 1)
-               bitmap[1] = ntohl(*p);
+               bitmap[1] = ntohl(*p++);
+       if (attrlen > 2)
+               bitmap[2] = ntohl(*p);
        return 0;
 }
 
@@ -446,7 +448,7 @@ static __be32 decode_recallany_args(struct svc_rqst *rqstp,
                                      void *argp)
 {
        struct cb_recallanyargs *args = argp;
-       uint32_t bitmap[2];
+       uint32_t bitmap[3];
        __be32 *p, status;
 
        p = xdr_inline_decode(xdr, 4);