Skip to content
  • Jonathan Nieder's avatar
    fix "bundle --stdin" segfault · 97a20eea
    Jonathan Nieder authored and Junio C Hamano's avatar Junio C Hamano committed
    
    
    When passed an empty list, objects_array_remove_duplicates() corrupts it
    by changing the number of entries from 0 to 1.
    
    The problem lies in the condition of its main loop:
    
    	for (ref = 0; ref < array->nr - 1; ref++) {
    
    The loop body manipulates the supplied object array.  In the case of an
    empty array, it should not be doing anything at all.  But array->nr is an
    unsigned quantity, so the code enters the loop, in particular increasing
    array->nr.  Fix this by comparing (ref + 1 < array->nr) instead.
    
    This bug can be triggered by git bundle --stdin:
    
    	$ echo HEAD | git bundle create some.bundle --stdin’
    	Segmentation fault (core dumped)
    
    The list of commits to bundle appears to be empty because of another bug:
    by the time the revision-walking machinery gets to look at it, standard
    input has already been consumed by rev-list, so this function gets an
    empty list of revisions.
    
    After this patch, git bundle --stdin still does not work; it just doesn’t
    segfault any more.
    
    Reported-by: default avatarJoey Hess <joey@kitenet.net>
    Signed-off-by: default avatarJonathan Nieder <jrnieder@gmail.com>
    Signed-off-by: default avatarJunio C Hamano <gitster@pobox.com>
    97a20eea