mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2024-12-01 09:46:46 +07:00
libceph: fix overflow in osdmap_decode()
On 32-bit systems, a large `n' would overflow `n * sizeof(u32)' and bypass the check ceph_decode_need(p, end, n * sizeof(u32), bad). It would also overflow the subsequent kmalloc() size, leading to out-of-bounds write. Signed-off-by: Xi Wang <xi.wang@gmail.com> Reviewed-by: Alex Elder <elder@inktank.com>
This commit is contained in:
parent
ad3b904c07
commit
e91a9b639a
@ -667,6 +667,9 @@ struct ceph_osdmap *osdmap_decode(void **p, void *end)
|
||||
ceph_decode_need(p, end, sizeof(u32) + sizeof(u64), bad);
|
||||
ceph_decode_copy(p, &pgid, sizeof(pgid));
|
||||
n = ceph_decode_32(p);
|
||||
err = -EINVAL;
|
||||
if (n > (UINT_MAX - sizeof(*pg)) / sizeof(u32))
|
||||
goto bad;
|
||||
ceph_decode_need(p, end, n * sizeof(u32), bad);
|
||||
err = -ENOMEM;
|
||||
pg = kmalloc(sizeof(*pg) + n*sizeof(u32), GFP_NOFS);
|
||||
|
Loading…
Reference in New Issue
Block a user