• S
    block/cloop: prevent offsets_size integer overflow (CVE-2014-0143) · 509a41ba
    Stefan Hajnoczi 提交于
    The following integer overflow in offsets_size can lead to out-of-bounds
    memory stores when n_blocks has a huge value:
    
        uint32_t n_blocks, offsets_size;
        [...]
        ret = bdrv_pread(bs->file, 128 + 4, &s->n_blocks, 4);
        [...]
        s->n_blocks = be32_to_cpu(s->n_blocks);
    
        /* read offsets */
        offsets_size = s->n_blocks * sizeof(uint64_t);
        s->offsets = g_malloc(offsets_size);
    
        [...]
    
        for(i=0;i<s->n_blocks;i++) {
            s->offsets[i] = be64_to_cpu(s->offsets[i]);
    
    offsets_size can be smaller than n_blocks due to integer overflow.
    Therefore s->offsets[] is too small when the for loop byteswaps offsets.
    
    This patch refuses to open files if offsets_size would overflow.
    
    Note that changing the type of offsets_size is not a fix since 32-bit
    hosts still only have 32-bit size_t.
    Signed-off-by: NStefan Hajnoczi <stefanha@redhat.com>
    Signed-off-by: NKevin Wolf <kwolf@redhat.com>
    Reviewed-by: NMax Reitz <mreitz@redhat.com>
    Signed-off-by: NStefan Hajnoczi <stefanha@redhat.com>
    509a41ba
cloop.c 7.0 KB