Skip to content
  • Brandon Williams's avatar
    connect: tell server that the client understands v1 · 0c2f0d27
    Brandon Williams authored and Junio C Hamano's avatar Junio C Hamano committed
    Teach the connection logic to tell a serve that it understands protocol
    v1.  This is done in 2 different ways for the builtin transports, both
    of which ultimately set 'GIT_PROTOCOL' to 'version=1' on the server.
    
    1. git://
       A normal request to git-daemon is structured as
       "command path/to/repo\0host=..\0" and due to a bug introduced in
       49ba83fb (Add virtualization support to git-daemon, 2006-09-19) we
       aren't able to place any extra arguments (separated by NULs) besides
       the host otherwise the parsing of those arguments would enter an
       infinite loop.  This bug was fixed in 73bb33a9 (daemon: Strictly
       parse the "extra arg" part of the command, 2009-06-04) but a check
       was put in place to disallow extra arguments so that new clients
       wouldn't trigger this bug in older servers.
    
       In order to get around this limitation git-daemon was taught to
       recognize additional request arguments hidden behind a second
       NUL byte.  Requests can then be structured like:
       "command path/to/repo\0host=..\0\0version=1\0key=value\0".
       git-daemon can then parse out the extra arguments and set
       'GIT_PROTOCOL' accordingly.
    
       By placing these extra arguments behind a second NUL byte we can
       skirt around both the infinite loop bug in 49ba83fb (Add
       virtualization support to git-daemon, 2006-09-19) as well as the
       explicit disallowing of extra arguments introduced in 73bb33a9
    
    
       (daemon: Strictly parse the "extra arg" part of the command,
       2009-06-04) because both of these versions of git-daemon check for a
       single NUL byte after the host argument before terminating the
       argument parsing.
    
    2. ssh://, file://
       Set 'GIT_PROTOCOL' environment variable with the desired protocol
       version.  With the file:// transport, 'GIT_PROTOCOL' can be set
       explicitly in the locally running git-upload-pack or git-receive-pack
       processes.  With the ssh:// transport and OpenSSH compliant ssh
       programs, 'GIT_PROTOCOL' can be sent across ssh by using '-o
       SendEnv=GIT_PROTOCOL' and having the server whitelist this
       environment variable.
    
    Signed-off-by: default avatarBrandon Williams <bmwill@google.com>
    Signed-off-by: default avatarJunio C Hamano <gitster@pobox.com>
    0c2f0d27