lkml.org 
[lkml]   [2012]   [Nov]   [26]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 093/270] libceph: fix overflow in osdmap_decode()
    Date
    3.5.7u1 -stable review patch.  If anyone has any objections, please let me know.

    ------------------

    From: Xi Wang <xi.wang@gmail.com>

    commit e91a9b639a691e0982088b5954eaafb5a25c8f1c upstream.

    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>
    Signed-off-by: Herton Ronaldo Krzesinski <herton.krzesinski@canonical.com>
    ---
    net/ceph/osdmap.c | 3 +++
    1 file changed, 3 insertions(+)

    diff --git a/net/ceph/osdmap.c b/net/ceph/osdmap.c
    index 95b2762..bc73341 100644
    --- a/net/ceph/osdmap.c
    +++ b/net/ceph/osdmap.c
    @@ -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);
    --
    1.7.9.5


    \
     
     \ /
      Last update: 2012-11-26 19:01    [W:2.182 / U:0.356 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site