Skip to content
  • Jeff King's avatar
    daemon: fix length computation in newline stripping · ed15e58e
    Jeff King authored and Junio C Hamano's avatar Junio C Hamano committed
    When git-daemon gets a pktline request, we strip off any
    trailing newline, replacing it with a NUL. Clients prior to
    5ad312be (in git v1.4.0) would send:
    
      git-upload-pack repo.git\n
    
    and we need to strip it off to understand their request.
    After 5ad312be
    
    , we send the host attribute but no newline,
    like:
    
      git-upload-pack repo.git\0host=example.com\0
    
    Both of these are parsed correctly by git-daemon. But if
    some client were to combine the two:
    
      git-upload-pack repo.git\n\0host=example.com\0
    
    we don't parse it correctly. The problem is that we use the
    "len" variable to record the position of the NUL separator,
    but then decrement it when we strip the newline. So we start
    with:
    
      git-upload-pack repo.git\n\0host=example.com\0
                                 ^-- len
    
    and end up with:
    
      git-upload-pack repo.git\0\0host=example.com\0
                               ^-- len
    
    This is arguably correct, since "len" tells us the length of
    the initial string, but we don't actually use it for that.
    What we do use it for is finding the offset of the extended
    attributes; they used to be at len+1, but are now at len+2.
    
    We can solve that by just leaving "len" where it is. We
    don't have to care about the length of the shortened string,
    since we just treat it like a C string.
    
    No version of Git ever produced such a string, but it seems
    like the daemon code meant to handle this case (and it seems
    like a reasonable thing for somebody to do in a 3rd-party
    implementation).
    
    Reported-by: default avatarMichael Haggerty <mhagger@alum.mit.edu>
    Signed-off-by: default avatarJeff King <peff@peff.net>
    Signed-off-by: default avatarJunio C Hamano <gitster@pobox.com>
    ed15e58e