Merge branch 'js/avoid-split-sideband-message'

The side-band status report can be sent at the same time as the
primary payload multiplexed, but the demultiplexer on the receiving
end incorrectly split a single status report into two, which has
been corrected.

* js/avoid-split-sideband-message:
  test-pkt-line: drop colon from sideband identity
  sideband: report unhandled incomplete sideband messages as bugs
  sideband: avoid reporting incomplete sideband messages
This commit is contained in:
Junio C Hamano 2020-11-02 13:17:37 -08:00
commit 6b9f5096eb
4 changed files with 33 additions and 1 deletions

View File

@ -471,6 +471,9 @@ int recv_sideband(const char *me, int in_stream, int out)
write_or_die(out, buf + 1, len - 1); write_or_die(out, buf + 1, len - 1);
break; break;
default: /* errors: message already written */ default: /* errors: message already written */
if (scratch.len > 0)
BUG("unhandled incomplete sideband: '%s'",
scratch.buf);
return sideband_type; return sideband_type;
} }
} }

View File

@ -190,7 +190,7 @@ int demultiplex_sideband(const char *me, char *buf, int len,
return 0; return 0;
case 1: case 1:
*sideband_type = SIDEBAND_PRIMARY; *sideband_type = SIDEBAND_PRIMARY;
break; return 1;
default: default:
strbuf_addf(scratch, "%s%s: protocol error: bad band #%d", strbuf_addf(scratch, "%s%s: protocol error: bad band #%d",
scratch->len ? "\n" : "", me, band); scratch->len ? "\n" : "", me, band);

View File

@ -84,6 +84,25 @@ static void unpack_sideband(void)
} }
} }
static int send_split_sideband(void)
{
const char *part1 = "Hello,";
const char *primary = "\001primary: regular output\n";
const char *part2 = " world!\n";
send_sideband(1, 2, part1, strlen(part1), LARGE_PACKET_MAX);
packet_write(1, primary, strlen(primary));
send_sideband(1, 2, part2, strlen(part2), LARGE_PACKET_MAX);
packet_response_end(1);
return 0;
}
static int receive_sideband(void)
{
return recv_sideband("sideband", 0, 1);
}
int cmd__pkt_line(int argc, const char **argv) int cmd__pkt_line(int argc, const char **argv)
{ {
if (argc < 2) if (argc < 2)
@ -95,6 +114,10 @@ int cmd__pkt_line(int argc, const char **argv)
unpack(); unpack();
else if (!strcmp(argv[1], "unpack-sideband")) else if (!strcmp(argv[1], "unpack-sideband"))
unpack_sideband(); unpack_sideband();
else if (!strcmp(argv[1], "send-split-sideband"))
send_split_sideband();
else if (!strcmp(argv[1], "receive-sideband"))
receive_sideband();
else else
die("invalid argument '%s'", argv[1]); die("invalid argument '%s'", argv[1]);

View File

@ -34,4 +34,10 @@ test_expect_success 'check for a bug in the regex routines' '
test-tool regex --bug test-tool regex --bug
' '
test_expect_success 'incomplete sideband messages are reassembled' '
test-tool pkt-line send-split-sideband >split-sideband &&
test-tool pkt-line receive-sideband <split-sideband 2>err &&
grep "Hello, world" err
'
test_done test_done