callback_xdr.c (f81483aaeb59da530b286fe5d081e1705eb5c886) | callback_xdr.c (b05bf5c63b326ce1da84ef42498d8e0e292e694c) |
---|---|
1// SPDX-License-Identifier: GPL-2.0 2/* 3 * linux/fs/nfs/callback_xdr.c 4 * 5 * Copyright (C) 2004 Trond Myklebust 6 * 7 * NFSv4 callback encode/decode procedures 8 */ --- 244 unchanged lines hidden (view full) --- 253} 254 255static 256__be32 decode_devicenotify_args(struct svc_rqst *rqstp, 257 struct xdr_stream *xdr, 258 void *argp) 259{ 260 struct cb_devicenotifyargs *args = argp; | 1// SPDX-License-Identifier: GPL-2.0 2/* 3 * linux/fs/nfs/callback_xdr.c 4 * 5 * Copyright (C) 2004 Trond Myklebust 6 * 7 * NFSv4 callback encode/decode procedures 8 */ --- 244 unchanged lines hidden (view full) --- 253} 254 255static 256__be32 decode_devicenotify_args(struct svc_rqst *rqstp, 257 struct xdr_stream *xdr, 258 void *argp) 259{ 260 struct cb_devicenotifyargs *args = argp; |
261 uint32_t tmp, n, i; |
|
261 __be32 *p; 262 __be32 status = 0; | 262 __be32 *p; 263 __be32 status = 0; |
263 u32 tmp; 264 int n, i; 265 args->ndevs = 0; | |
266 267 /* Num of device notifications */ 268 p = xdr_inline_decode(xdr, sizeof(uint32_t)); 269 if (unlikely(p == NULL)) { 270 status = htonl(NFS4ERR_BADXDR); 271 goto out; 272 } 273 n = ntohl(*p++); | 264 265 /* Num of device notifications */ 266 p = xdr_inline_decode(xdr, sizeof(uint32_t)); 267 if (unlikely(p == NULL)) { 268 status = htonl(NFS4ERR_BADXDR); 269 goto out; 270 } 271 n = ntohl(*p++); |
274 if (n <= 0) | 272 if (n == 0) |
275 goto out; 276 if (n > ULONG_MAX / sizeof(*args->devs)) { 277 status = htonl(NFS4ERR_BADXDR); 278 goto out; 279 } 280 281 args->devs = kmalloc_array(n, sizeof(*args->devs), GFP_KERNEL); 282 if (!args->devs) { --- 42 unchanged lines hidden (view full) --- 325 status = htonl(NFS4ERR_BADXDR); 326 goto err; 327 } 328 dev->cbd_immediate = ntohl(*p++); 329 } else { 330 dev->cbd_immediate = 0; 331 } 332 | 273 goto out; 274 if (n > ULONG_MAX / sizeof(*args->devs)) { 275 status = htonl(NFS4ERR_BADXDR); 276 goto out; 277 } 278 279 args->devs = kmalloc_array(n, sizeof(*args->devs), GFP_KERNEL); 280 if (!args->devs) { --- 42 unchanged lines hidden (view full) --- 323 status = htonl(NFS4ERR_BADXDR); 324 goto err; 325 } 326 dev->cbd_immediate = ntohl(*p++); 327 } else { 328 dev->cbd_immediate = 0; 329 } 330 |
333 args->ndevs++; 334 | |
335 dprintk("%s: type %d layout 0x%x immediate %d\n", 336 __func__, dev->cbd_notify_type, dev->cbd_layout_type, 337 dev->cbd_immediate); 338 } | 331 dprintk("%s: type %d layout 0x%x immediate %d\n", 332 __func__, dev->cbd_notify_type, dev->cbd_layout_type, 333 dev->cbd_immediate); 334 } |
335 args->ndevs = n; 336 dprintk("%s: ndevs %d\n", __func__, args->ndevs); 337 return 0; 338err: 339 kfree(args->devs); |
|
339out: | 340out: |
341 args->devs = NULL; 342 args->ndevs = 0; |
|
340 dprintk("%s: status %d ndevs %d\n", 341 __func__, ntohl(status), args->ndevs); 342 return status; | 343 dprintk("%s: status %d ndevs %d\n", 344 __func__, ntohl(status), args->ndevs); 345 return status; |
343err: 344 kfree(args->devs); 345 goto out; | |
346} 347 348static __be32 decode_sessionid(struct xdr_stream *xdr, 349 struct nfs4_sessionid *sid) 350{ 351 __be32 *p; 352 353 p = xdr_inline_decode(xdr, NFS4_MAX_SESSIONID_LEN); --- 747 unchanged lines hidden --- | 346} 347 348static __be32 decode_sessionid(struct xdr_stream *xdr, 349 struct nfs4_sessionid *sid) 350{ 351 __be32 *p; 352 353 p = xdr_inline_decode(xdr, NFS4_MAX_SESSIONID_LEN); --- 747 unchanged lines hidden --- |