• Show log

    Commit

  • Hash : 5265b31c
    Author : Patrick Steinhardt
    Date : 2019-01-23T15:00:20

    streams: fix callers potentially only writing partial data
    
    Similar to the write(3) function, implementations of `git_stream_write`
    do not guarantee that all bytes are written. Instead, they return the
    number of bytes that actually have been written, which may be smaller
    than the total number of bytes. Furthermore, due to an interface design
    issue, we cannot ever write more than `SSIZE_MAX` bytes at once, as
    otherwise we cannot represent the number of bytes written to the caller.
    
    Unfortunately, no caller of `git_stream_write` ever checks the return
    value, except to verify that no error occurred. Due to this, they are
    susceptible to the case where only partial data has been written.
    
    Fix this by introducing a new function `git_stream__write_full`. In
    contrast to `git_stream_write`, it will always return either success or
    failure, without returning the number of bytes written. Thus, it is able
    to write all `SIZE_MAX` bytes and loop around `git_stream_write` until
    all data has been written. Adjust all callers except the BIO callbacks
    in our mbedtls and OpenSSL streams, which already do the right thing and
    require the amount of bytes written.