Skip to content

Commit

Permalink
transport: optionally disable side-band-64k
Browse files Browse the repository at this point in the history
Since commit 0c499ea (send-pack: demultiplex a sideband stream with
status data, 2010-02-05) the send-pack builtin uses the side-band-64k
capability if advertised by the server.

Unfortunately this breaks pushing over the dump git protocol if used
over a network connection.

The detailed reasons for this breakage are (by courtesy of Jeff Preshing,
quoted from https://groups.google.com/d/msg/msysgit/at8D7J-h7mw/eaLujILGUWoJ):

	MinGW wraps Windows sockets in CRT file descriptors in order to
	mimic the functionality of POSIX sockets. This causes msvcrt.dll
	to treat sockets as Installable File System (IFS) handles,
	calling ReadFile, WriteFile, DuplicateHandle and CloseHandle on
	them. This approach works well in simple cases on recent
	versions of Windows, but does not support all usage patterns. In
	particular, using this approach, any attempt to read & write
	concurrently on the same socket (from one or more processes)
	will deadlock in a scenario where the read waits for a response
	from the server which is only invoked after the write. This is
	what send_pack currently attempts to do in the use_sideband
	codepath.

The new config option `sendpack.sideband` allows to override the
side-band-64k capability of the server, and thus makes the dumb git
protocol work.

Other transportation methods like ssh and http/https still benefit from
the sideband channel, therefore the default value of `sendpack.sideband`
is still true.

Signed-off-by: Thomas Braun <thomas.braun@byte-physics.de>
Signed-off-by: Oliver Schneider <oliver@assarbad.net>
Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
  • Loading branch information
t-b authored and Git for Windows Build Agent committed Jul 11, 2024
1 parent ba7a92b commit 9de3b1d
Show file tree
Hide file tree
Showing 3 changed files with 10 additions and 3 deletions.
2 changes: 2 additions & 0 deletions Documentation/config.txt
Original file line number Diff line number Diff line change
Expand Up @@ -518,6 +518,8 @@ include::config/safe.txt[]

include::config/sendemail.txt[]

include::config/sendpack.txt[]

include::config/sequencer.txt[]

include::config/showbranch.txt[]
Expand Down
5 changes: 5 additions & 0 deletions Documentation/config/sendpack.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
sendpack.sideband::
Allows to disable the side-band-64k capability for send-pack even
when it is advertised by the server. Makes it possible to work
around a limitation in the git for windows implementation together
with the dump git protocol. Defaults to true.
6 changes: 3 additions & 3 deletions send-pack.c
Original file line number Diff line number Diff line change
Expand Up @@ -488,7 +488,7 @@ int send_pack(struct send_pack_args *args,
int need_pack_data = 0;
int allow_deleting_refs = 0;
int status_report = 0;
int use_sideband = 0;
int use_sideband = 1;
int quiet_supported = 0;
int agent_supported = 0;
int advertise_sid = 0;
Expand All @@ -511,6 +511,7 @@ int send_pack(struct send_pack_args *args,
return 0;
}

git_config_get_bool("sendpack.sideband", &use_sideband);
git_config_get_bool("push.negotiate", &push_negotiate);
if (push_negotiate)
get_commons_through_negotiation(args->url, remote_refs, &commons);
Expand All @@ -529,8 +530,7 @@ int send_pack(struct send_pack_args *args,
allow_deleting_refs = 1;
if (server_supports("ofs-delta"))
args->use_ofs_delta = 1;
if (server_supports("side-band-64k"))
use_sideband = 1;
use_sideband = use_sideband && server_supports("side-band-64k");
if (server_supports("quiet"))
quiet_supported = 1;
if (server_supports("agent"))
Expand Down

0 comments on commit 9de3b1d

Please sign in to comment.