Skip to content
  • Jeff King's avatar
    daemon: free listen_addr before returning · badf2fe1
    Jeff King authored and Junio C Hamano's avatar Junio C Hamano committed
    
    
    We build up a string list of listen addresses from the command-line
    arguments, but never free it. This causes t5811 to complain of a leak
    (though curiously it seems to do so only when compiled with gcc, not
    with clang).
    
    To handle this correctly, we have to do a little refactoring:
    
      - there are two exit points from the main function, depending on
        whether we are entering the main loop or serving a single client
        (since rather than a traditional fork model, we re-exec ourselves
        with the extra "--serve" argument to accommodate Windows).
    
        We don't need --listen at all in the --serve case, of course, but it
        is passed along by the parent daemon, which simply copies all of the
        command-line options it got.
    
      - we just "return serve()" to run the main loop, giving us no chance
        to do any cleanup
    
    So let's use a "ret" variable to store the return code, and give
    ourselves a single exit point at the end. That gives us one place to do
    cleanup.
    
    Note that this code also uses the "use a no-dup string-list, but
    allocate strings we add to it" trick, meaning string_list_clear() will
    not realize it should free them. We can fix this by switching to a "dup"
    string-list, but using the "append_nodup" function to add to it (this is
    preferable to tweaking the strdup_strings flag before clearing, as it
    puts all the subtle memory-ownership code together).
    
    Signed-off-by: default avatarJeff King <peff@peff.net>
    Signed-off-by: default avatarJunio C Hamano <gitster@pobox.com>
    badf2fe1