sparc64: viohs: Remove VLA usage
In the quest to remove all stack VLA usage from the kernel[1], this allocates a fixed size array for the maximum number of cookies and adds a runtime sanity check. [1] https://lkml.kernel.org/r/CA+55aFzCG-zNmZwX4A2FQpadafLfEzK6CC=qPXydAacU1 RqZWA@mail.gmail.com Signed-off-by: Kees Cook <keescook@chromium.org> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
df58f37b5d
commit
31a43fa794
|
@ -180,11 +180,17 @@ static int send_dreg(struct vio_driver_state *vio)
|
||||||
struct vio_dring_register pkt;
|
struct vio_dring_register pkt;
|
||||||
char all[sizeof(struct vio_dring_register) +
|
char all[sizeof(struct vio_dring_register) +
|
||||||
(sizeof(struct ldc_trans_cookie) *
|
(sizeof(struct ldc_trans_cookie) *
|
||||||
dr->ncookies)];
|
VIO_MAX_RING_COOKIES)];
|
||||||
} u;
|
} u;
|
||||||
|
size_t bytes = sizeof(struct vio_dring_register) +
|
||||||
|
(sizeof(struct ldc_trans_cookie) *
|
||||||
|
dr->ncookies);
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
memset(&u, 0, sizeof(u));
|
if (WARN_ON(bytes > sizeof(u)))
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
|
memset(&u, 0, bytes);
|
||||||
init_tag(&u.pkt.tag, VIO_TYPE_CTRL, VIO_SUBTYPE_INFO, VIO_DRING_REG);
|
init_tag(&u.pkt.tag, VIO_TYPE_CTRL, VIO_SUBTYPE_INFO, VIO_DRING_REG);
|
||||||
u.pkt.dring_ident = 0;
|
u.pkt.dring_ident = 0;
|
||||||
u.pkt.num_descr = dr->num_entries;
|
u.pkt.num_descr = dr->num_entries;
|
||||||
|
@ -206,7 +212,7 @@ static int send_dreg(struct vio_driver_state *vio)
|
||||||
(unsigned long long) u.pkt.cookies[i].cookie_size);
|
(unsigned long long) u.pkt.cookies[i].cookie_size);
|
||||||
}
|
}
|
||||||
|
|
||||||
return send_ctrl(vio, &u.pkt.tag, sizeof(u));
|
return send_ctrl(vio, &u.pkt.tag, bytes);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int send_rdx(struct vio_driver_state *vio)
|
static int send_rdx(struct vio_driver_state *vio)
|
||||||
|
|
Loading…
Reference in New Issue