Skip to content
  • Jeff King's avatar
    pkt-line: provide a LARGE_PACKET_MAX static buffer · 74543a04
    Jeff King authored and Junio C Hamano's avatar Junio C Hamano committed
    
    
    Most of the callers of packet_read_line just read into a
    static 1000-byte buffer (callers which handle arbitrary
    binary data already use LARGE_PACKET_MAX). This works fine
    in practice, because:
    
      1. The only variable-sized data in these lines is a ref
         name, and refs tend to be a lot shorter than 1000
         characters.
    
      2. When sending ref lines, git-core always limits itself
         to 1000 byte packets.
    
    However, the only limit given in the protocol specification
    in Documentation/technical/protocol-common.txt is
    LARGE_PACKET_MAX; the 1000 byte limit is mentioned only in
    pack-protocol.txt, and then only describing what we write,
    not as a specific limit for readers.
    
    This patch lets us bump the 1000-byte limit to
    LARGE_PACKET_MAX. Even though git-core will never write a
    packet where this makes a difference, there are two good
    reasons to do this:
    
      1. Other git implementations may have followed
         protocol-common.txt and used a larger maximum size. We
         don't bump into it in practice because it would involve
         very long ref names.
    
      2. We may want to increase the 1000-byte limit one day.
         Since packets are transferred before any capabilities,
         it's difficult to do this in a backwards-compatible
         way. But if we bump the size of buffer the readers can
         handle, eventually older versions of git will be
         obsolete enough that we can justify bumping the
         writers, as well. We don't have plans to do this
         anytime soon, but there is no reason not to start the
         clock ticking now.
    
    Just bumping all of the reading bufs to LARGE_PACKET_MAX
    would waste memory. Instead, since most readers just read
    into a temporary buffer anyway, let's provide a single
    static buffer that all callers can use. We can further wrap
    this detail away by having the packet_read_line wrapper just
    use the buffer transparently and return a pointer to the
    static storage.  That covers most of the cases, and the
    remaining ones already read into their own LARGE_PACKET_MAX
    buffers.
    
    Signed-off-by: default avatarJeff King <peff@peff.net>
    Signed-off-by: default avatarJunio C Hamano <gitster@pobox.com>
    74543a04