Loading fs/nfsd/nfs4xdr.c +29 −21 Original line number Diff line number Diff line Loading @@ -638,6 +638,21 @@ nfsd4_decode_state_owner4(struct nfsd4_compoundargs *argp, return nfsd4_decode_opaque(argp, owner); } #ifdef CONFIG_NFSD_PNFS static __be32 nfsd4_decode_deviceid4(struct nfsd4_compoundargs *argp, struct nfsd4_deviceid *devid) { __be32 *p; p = xdr_inline_decode(argp->xdr, NFS4_DEVICEID4_SIZE); if (!p) return nfserr_bad_xdr; memcpy(devid, p, sizeof(*devid)); return nfs_ok; } #endif /* CONFIG_NFSD_PNFS */ static __be32 nfsd4_decode_sessionid4(struct nfsd4_compoundargs *argp, struct nfs4_sessionid *sessionid) Loading Loading @@ -1765,27 +1780,20 @@ static __be32 nfsd4_decode_getdeviceinfo(struct nfsd4_compoundargs *argp, struct nfsd4_getdeviceinfo *gdev) { DECODE_HEAD; u32 num, i; READ_BUF(sizeof(struct nfsd4_deviceid) + 3 * 4); COPYMEM(&gdev->gd_devid, sizeof(struct nfsd4_deviceid)); gdev->gd_layout_type = be32_to_cpup(p++); gdev->gd_maxcount = be32_to_cpup(p++); num = be32_to_cpup(p++); if (num) { if (num > 1000) goto xdr_error; READ_BUF(4 * num); gdev->gd_notify_types = be32_to_cpup(p++); for (i = 1; i < num; i++) { if (be32_to_cpup(p++)) { status = nfserr_inval; goto out; } } } DECODE_TAIL; __be32 status; status = nfsd4_decode_deviceid4(argp, &gdev->gd_devid); if (status) return status; if (xdr_stream_decode_u32(argp->xdr, &gdev->gd_layout_type) < 0) return nfserr_bad_xdr; if (xdr_stream_decode_u32(argp->xdr, &gdev->gd_maxcount) < 0) return nfserr_bad_xdr; if (xdr_stream_decode_uint32_array(argp->xdr, &gdev->gd_notify_types, 1) < 0) return nfserr_bad_xdr; return nfs_ok; } static __be32 Loading Loading
fs/nfsd/nfs4xdr.c +29 −21 Original line number Diff line number Diff line Loading @@ -638,6 +638,21 @@ nfsd4_decode_state_owner4(struct nfsd4_compoundargs *argp, return nfsd4_decode_opaque(argp, owner); } #ifdef CONFIG_NFSD_PNFS static __be32 nfsd4_decode_deviceid4(struct nfsd4_compoundargs *argp, struct nfsd4_deviceid *devid) { __be32 *p; p = xdr_inline_decode(argp->xdr, NFS4_DEVICEID4_SIZE); if (!p) return nfserr_bad_xdr; memcpy(devid, p, sizeof(*devid)); return nfs_ok; } #endif /* CONFIG_NFSD_PNFS */ static __be32 nfsd4_decode_sessionid4(struct nfsd4_compoundargs *argp, struct nfs4_sessionid *sessionid) Loading Loading @@ -1765,27 +1780,20 @@ static __be32 nfsd4_decode_getdeviceinfo(struct nfsd4_compoundargs *argp, struct nfsd4_getdeviceinfo *gdev) { DECODE_HEAD; u32 num, i; READ_BUF(sizeof(struct nfsd4_deviceid) + 3 * 4); COPYMEM(&gdev->gd_devid, sizeof(struct nfsd4_deviceid)); gdev->gd_layout_type = be32_to_cpup(p++); gdev->gd_maxcount = be32_to_cpup(p++); num = be32_to_cpup(p++); if (num) { if (num > 1000) goto xdr_error; READ_BUF(4 * num); gdev->gd_notify_types = be32_to_cpup(p++); for (i = 1; i < num; i++) { if (be32_to_cpup(p++)) { status = nfserr_inval; goto out; } } } DECODE_TAIL; __be32 status; status = nfsd4_decode_deviceid4(argp, &gdev->gd_devid); if (status) return status; if (xdr_stream_decode_u32(argp->xdr, &gdev->gd_layout_type) < 0) return nfserr_bad_xdr; if (xdr_stream_decode_u32(argp->xdr, &gdev->gd_maxcount) < 0) return nfserr_bad_xdr; if (xdr_stream_decode_uint32_array(argp->xdr, &gdev->gd_notify_types, 1) < 0) return nfserr_bad_xdr; return nfs_ok; } static __be32 Loading