- Ignore Branches output from cvsps-2.2b1 (bug 490602) - Escape newline in git-daemon xinetd description (bug 502393)
114 lines
3.8 KiB
Diff
114 lines
3.8 KiB
Diff
From ccf9fce9da3cda9ee869c70a048971c7f231a78a Mon Sep 17 00:00:00 2001
|
|
From: Shawn O. Pearce <spearce@spearce.org>
|
|
Date: Thu, 4 Jun 2009 18:33:32 -0700
|
|
Subject: [PATCH] daemon: Strictly parse the "extra arg" part of the command
|
|
|
|
This is a backport of upstream commit 73bb33a.
|
|
|
|
Since 1.4.4.5 (49ba83fb67 "Add virtualization support to git-daemon")
|
|
git daemon enters an infinite loop and never terminates if a client
|
|
hides any extra arguments in the initial request line which is not
|
|
exactly "\0host=blah\0".
|
|
|
|
Since that change, a client must never insert additional extra
|
|
arguments, or attempt to use any argument other than "host=", as
|
|
any daemon will get stuck parsing the request line and will never
|
|
complete the request.
|
|
|
|
Since the client can't tell if the daemon is patched or not, it
|
|
is not possible to know if additional extra args might actually be
|
|
able to be safely requested.
|
|
|
|
If we ever need to extend the git daemon protocol to support a new
|
|
feature, we may have to do something like this to the exchange:
|
|
|
|
# If both support git:// v2
|
|
#
|
|
C: 000cgit://v2
|
|
S: 0010ok host user
|
|
C: 0018host git.kernel.org
|
|
C: 0027git-upload-pack /pub/linux-2.6.git
|
|
S: ...git-upload-pack header...
|
|
|
|
# If client supports git:// v2, server does not:
|
|
#
|
|
C: 000cgit://v2
|
|
S: <EOF>
|
|
|
|
C: 003bgit-upload-pack /pub/linux-2.6.git\0host=git.kernel.org\0
|
|
S: ...git-upload-pack header...
|
|
|
|
This requires the client to create two TCP connections to talk to
|
|
an older git daemon, however all daemons since the introduction of
|
|
daemon.c will safely reject the unknown "git://v2" command request,
|
|
so the client can quite easily determine the server supports an
|
|
older protocol.
|
|
|
|
Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
|
|
Signed-off-by: Junio C Hamano <gitster@pobox.com>
|
|
---
|
|
connect.c | 5 ++++-
|
|
daemon.c | 11 ++++++-----
|
|
2 files changed, 10 insertions(+), 6 deletions(-)
|
|
|
|
diff --git a/connect.c b/connect.c
|
|
index dd96f8e..c7a9f6d 100644
|
|
--- a/connect.c
|
|
+++ b/connect.c
|
|
@@ -573,7 +573,10 @@ struct child_process *git_connect(int fd[2], const char *url_orig,
|
|
git_tcp_connect(fd, host, flags);
|
|
/*
|
|
* Separate original protocol components prog and path
|
|
- * from extended components with a NUL byte.
|
|
+ * from extended host header with a NUL byte.
|
|
+ *
|
|
+ * Note: Do not add any other headers here! Doing so
|
|
+ * will cause older git-daemon servers to crash.
|
|
*/
|
|
packet_write(fd[1],
|
|
"%s %s%chost=%s%c",
|
|
diff --git a/daemon.c b/daemon.c
|
|
index 8dcde73..325766e 100644
|
|
--- a/daemon.c
|
|
+++ b/daemon.c
|
|
@@ -432,16 +432,15 @@ static void make_service_overridable(const char *name, int ena)
|
|
}
|
|
|
|
/*
|
|
- * Separate the "extra args" information as supplied by the client connection.
|
|
- * Any resulting data is squirreled away in the given interpolation table.
|
|
+ * Read the host as supplied by the client connection.
|
|
*/
|
|
-static void parse_extra_args(struct interp *table, char *extra_args, int buflen)
|
|
+static void parse_host_arg(struct interp *table, char *extra_args, int buflen)
|
|
{
|
|
char *val;
|
|
int vallen;
|
|
char *end = extra_args + buflen;
|
|
|
|
- while (extra_args < end && *extra_args) {
|
|
+ if (extra_args < end && *extra_args) {
|
|
saw_extended_args = 1;
|
|
if (strncasecmp("host=", extra_args, 5) == 0) {
|
|
val = extra_args + 5;
|
|
@@ -461,6 +460,8 @@ static void parse_extra_args(struct interp *table, char *extra_args, int buflen)
|
|
/* On to the next one */
|
|
extra_args = val + vallen;
|
|
}
|
|
+ if (extra_args < end && *extra_args)
|
|
+ die("Invalid request");
|
|
}
|
|
}
|
|
|
|
@@ -580,7 +581,7 @@ static int execute(struct sockaddr *addr)
|
|
interp_set_entry(interp_table, INTERP_SLOT_PERCENT, "%");
|
|
|
|
if (len != pktlen) {
|
|
- parse_extra_args(interp_table, line + len + 1, pktlen - len - 1);
|
|
+ parse_host_arg(interp_table, line + len + 1, pktlen - len - 1);
|
|
fill_in_extra_table_entries(interp_table);
|
|
}
|
|
|
|
--
|
|
1.6.3.2
|
|
|