enum sideband_type sideband_type;
while (1) {
- len = packet_read(in_stream, NULL, NULL, buf, LARGE_PACKET_MAX,
- 0);
- if (!demultiplex_sideband(me, buf, len, 0, &scratch,
+ int status = packet_read_with_status(in_stream, NULL, NULL,
+ buf, LARGE_PACKET_MAX,
+ &len,
+ PACKET_READ_GENTLE_ON_EOF);
+ if (!demultiplex_sideband(me, status, buf, len, 0, &scratch,
&sideband_type))
continue;
switch (sideband_type) {
reader->options);
if (!reader->use_sideband)
break;
- if (demultiplex_sideband(reader->me, reader->buffer,
- reader->pktlen, 1, &scratch,
- &sideband_type))
+ if (demultiplex_sideband(reader->me, reader->status,
+ reader->buffer, reader->pktlen, 1,
+ &scratch, &sideband_type))
break;
}
#include "config.h"
#include "sideband.h"
#include "help.h"
+#include "pkt-line.h"
struct keyword_entry {
/*
#define ANSI_SUFFIX "\033[K"
#define DUMB_SUFFIX " "
-int demultiplex_sideband(const char *me, char *buf, int len,
+int demultiplex_sideband(const char *me, int status,
+ char *buf, int len,
int die_on_error,
struct strbuf *scratch,
enum sideband_type *sideband_type)
suffix = DUMB_SUFFIX;
}
- if (len == 0) {
- *sideband_type = SIDEBAND_FLUSH;
- goto cleanup;
- }
- if (len < 1) {
+ if (status == PACKET_READ_EOF) {
strbuf_addf(scratch,
- "%s%s: protocol error: no band designator",
+ "%s%s: unexpected disconnect while reading sideband packet",
scratch->len ? "\n" : "", me);
*sideband_type = SIDEBAND_PROTOCOL_ERROR;
goto cleanup;
}
+
+ if (len < 0)
+ BUG("negative length on non-eof packet read");
+
+ if (len == 0) {
+ if (status == PACKET_READ_NORMAL) {
+ strbuf_addf(scratch,
+ "%s%s: protocol error: missing sideband designator",
+ scratch->len ? "\n" : "", me);
+ *sideband_type = SIDEBAND_PROTOCOL_ERROR;
+ } else {
+ /* covers flush, delim, etc */
+ *sideband_type = SIDEBAND_FLUSH;
+ }
+ goto cleanup;
+ }
+
band = buf[0] & 0xff;
buf[len] = '\0';
len--;
*
* scratch must be a struct strbuf allocated by the caller. It is used to store
* progress messages split across multiple packets.
+ *
+ * The "status" parameter is a pkt-line response as returned by
+ * packet_read_with_status() (e.g., PACKET_READ_NORMAL).
*/
-int demultiplex_sideband(const char *me, char *buf, int len,
+int demultiplex_sideband(const char *me, int status,
+ char *buf, int len,
int die_on_error,
struct strbuf *scratch,
enum sideband_type *sideband_type);
grep "Hello, world" err
'
+test_expect_success 'eof on sideband message is reported' '
+ printf 1234 >input &&
+ test-tool pkt-line receive-sideband <input 2>err &&
+ test_i18ngrep "unexpected disconnect" err
+'
+
+test_expect_success 'missing sideband designator is reported' '
+ printf 0004 >input &&
+ test-tool pkt-line receive-sideband <input 2>err &&
+ test_i18ngrep "missing sideband" err
+'
+
test_done