• T
    strbuf_grow(): maintain nul-termination even for new buffer · 8c74ef1e
    Thomas Rast 提交于
    In the case where sb is initialized to the slopbuf (through
    strbuf_init(sb,0) or STRBUF_INIT), strbuf_grow() loses the terminating
    nul: it grows the buffer, but gives ALLOC_GROW a NULL source to avoid
    it being freed.  So ALLOC_GROW does not copy anything to the new
    memory area.
    
    This subtly broke the call to strbuf_getline in read_next_command()
    [fast-import.c:1855], which goes
    
        strbuf_detach(&command_buf, NULL);  # command_buf is now = STRBUF_INIT
        stdin_eof = strbuf_getline(&command_buf, stdin, '\n');
        if (stdin_eof)
                return EOF;
    
    In strbuf_getwholeline, this did
    
        strbuf_grow(sb, 0);  # loses nul-termination
        if (feof(fp))
                return EOF;
        strbuf_reset(sb);    # this would have nul-terminated!
    
    Valgrind found this because fast-import subsequently uses prefixcmp()
    on command_buf.buf, which after the EOF exit contains only
    uninitialized memory.
    
    Arguably strbuf_getwholeline is also broken, in that it touches the
    buffer before deciding whether to do any work.  However, it seems more
    futureproof to not let the strbuf API lose the nul-termination by its
    own fault.
    
    So make sure that strbuf_grow() puts in a nul even if it has nowhere
    to copy it from.  This makes strbuf_grow(sb, 0) a semantic no-op as
    far as readers of the buffer are concerned.
    
    Also remove the nul-termination added by strbuf_init, which is made
    redudant.
    Signed-off-by: NThomas Rast <trast@student.ethz.ch>
    Signed-off-by: NJunio C Hamano <gitster@pobox.com>
    8c74ef1e
strbuf.c 7.9 KB