• J
    Fix infinite loop when deleting multiple packed refs. · 1084b845
    Junio C Hamano 提交于
    It was stupid to link the same element twice to lock_file_list
    and end up in a loop, so we certainly need a fix.
    
    But it is not like we are taking a lock on multiple files in
    this case.  It is just that we leave the linked element on the
    list even after commit_lock_file() successfully removes the
    cruft.
    
    We cannot remove the list element in commit_lock_file(); if we
    are interrupted in the middle of list manipulation, the call to
    remove_lock_file_on_signal() will happen with a broken list
    structure pointed by lock_file_list, which would cause the cruft
    to remain, so not removing the list element is the right thing
    to do.  Instead we should be reusing the element already on the
    list.
    
    There is already a code for that in lock_file() function in
    lockfile.c.  The code checks lk->next and the element is linked
    only when it is not already on the list -- which is incorrect
    for the last element on the list (which has NULL in its next
    field), but if you read the check as "is this element already on
    the list?" it actually makes sense.  We do not want to link it
    on the list again, nor we would want to set up signal/atexit
    over and over.
    Signed-off-by: NJunio C Hamano <junkio@cox.net>
    1084b845
refs.c 20.9 KB