Skip to content
  • Jeff King's avatar
    encode_in_pack_object_header: respect output buffer length · 7202a6fa
    Jeff King authored and Junio C Hamano's avatar Junio C Hamano committed
    
    
    The encode_in_pack_object_header() writes a variable-length
    header to an output buffer, but it doesn't actually know
    long the buffer is. At first glance, this looks like it
    might be possible to overflow.
    
    In practice, this is probably impossible. The smallest
    buffer we use is 10 bytes, which would hold the header for
    an object up to 2^67 bytes. Obviously we're not likely to
    see such an object, but we might worry that an object could
    lie about its size (causing us to overflow before we realize
    it does not actually have that many bytes). But the argument
    is passed as a uintmax_t. Even on systems that have __int128
    available, uintmax_t is typically restricted to 64-bit by
    the ABI.
    
    So it's unlikely that a system exists where this could be
    exploited. Still, it's easy enough to use a normal out/len
    pair and make sure we don't write too far. That protects the
    hypothetical 128-bit system, makes it harder for callers to
    accidentally specify a too-small buffer, and makes the
    resulting code easier to audit.
    
    Note that the one caller in fast-import tried to catch such
    a case, but did so _after_ the call (at which point we'd
    have already overflowed!). This check can now go away.
    
    Signed-off-by: default avatarJeff King <peff@peff.net>
    Signed-off-by: default avatarJunio C Hamano <gitster@pobox.com>
    7202a6fa