Skip to content
  • Allan Xavier's avatar
    line-log.c: prevent crash during union of too many ranges · aaae0bf7
    Allan Xavier authored and Junio C Hamano's avatar Junio C Hamano committed
    
    
    The existing implementation of range_set_union does not correctly
    reallocate memory, leading to a heap overflow when it attempts to union
    more than 24 separate line ranges.
    
    For struct range_set *out to grow correctly it must have out->nr set to
    the current size of the buffer when it is passed to range_set_grow.
    However, the existing implementation of range_set_union only updates
    out->nr at the end of the function, meaning that it is always zero
    before this. This results in range_set_grow never growing the buffer, as
    well as some of the union logic itself being incorrect as !out->nr is
    always true.
    
    The reason why 24 is the limit is that the first allocation of size 1
    ends up allocating a buffer of size 24 (due to the call to alloc_nr in
    ALLOC_GROW). This goes some way to explain why this hasn't been
    caught before.
    
    Fix the problem by correctly updating out->nr after reallocating the
    range_set. As this results in out->nr containing the same value as the
    variable o, replace o with out->nr as well.
    
    Finally, add a new test to help prevent the problem reoccurring in the
    future. Thanks to Vegard Nossum for writing the test.
    
    Signed-off-by: default avatarAllan Xavier <allan.x.xavier@oracle.com>
    Reviewed-by: default avatarJeff King <peff@peff.net>
    Signed-off-by: default avatarJunio C Hamano <gitster@pobox.com>
    aaae0bf7