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 ---