pkt-line: do not chomp newlines for sideband messages

When calling "packet_read_with_status()" to parse pkt-line encoded packets, we can turn on the flag "PACKET_READ_CHOMP_NEWLINE" to chomp newline character for each packet for better line matching. But when receiving data and progress information using sideband, we should turn off the flag "PACKET_READ_CHOMP_NEWLINE" to prevent mangling newline characters from data and progress information. When both the server and the client support "sideband-all" capability, we have a dilemma that newline characters in negotiation packets should be removed, but the newline characters in the progress information should be left intact. Add new flag "PACKET_READ_USE_SIDEBAND" for "packet_read_with_status()" to prevent mangling newline characters in sideband messages. Helped-by: Jonathan Tan <jonathantanmy@google.com> Helped-by: Oswald Buddenhagen <oswald.buddenhagen@gmx.de> Signed-off-by: Jiang Xin <zhiyou.jx@alibaba-inc.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>

Jiang Xin committed Dec 17, 2023 at 22:41 UTC 7033d5479b8a7b8e7c33892f23d106c33c938ff4
3 files changed +31 -3
pkt-line.c
+29 -2
@@ -462,8 +462,32 @@ enum packet_read_status packet_read_with_status(int fd, char **src_buffer,
462 }
463
464 if ((options & PACKET_READ_CHOMP_NEWLINE) &&
465 - len && buffer[len-1] == '\n')
466 - len--;
465 + len && buffer[len-1] == '\n') {
466 + if (options & PACKET_READ_USE_SIDEBAND) {
467 + int band = *buffer & 0xff;
468 + switch (band) {
469 + case 1:
470 + /* Chomp newline for payload */
471 + len--;
472 + break;
473 + case 2:
474 + case 3:
475 + /*
476 + * Do not chomp newline for progress and error
477 + * message.
478 + */
479 + break;
480 + default:
481 + /*
482 + * Bad sideband, let's leave it to
483 + * demultiplex_sideband() to catch this error.
484 + */
485 + break;
486 + }
487 + } else {
488 + len--;
489 + }
490 + }
491
492 buffer[len] = 0;
493 if (options & PACKET_READ_REDACT_URI_PATH &&
@@ -602,6 +626,9 @@ enum packet_read_status packet_reader_read(struct packet_reader *reader)
626 return reader->status;
627 }
628
629 + if (reader->use_sideband)
630 + reader->options |= PACKET_READ_USE_SIDEBAND;
631 +
632 /*
633 * Consume all progress packets until a primary payload packet is
634 * received
pkt-line.h
+1
@@ -85,6 +85,7 @@ void packet_fflush(FILE *f);
85 #define PACKET_READ_DIE_ON_ERR_PACKET (1u<<2)
86 #define PACKET_READ_GENTLE_ON_READ_ERROR (1u<<3)
87 #define PACKET_READ_REDACT_URI_PATH (1u<<4)
88 +#define PACKET_READ_USE_SIDEBAND (1u<<5)
89 int packet_read(int fd, char *buffer, unsigned size, int options);
90
91 /*
t/t0070-fundamental.sh
+1 -1
@@ -97,7 +97,7 @@ test_expect_success 'unpack-sideband: packet_reader_read() consumes sideband, no
97 test_cmp expect-err err
98 '
99
100 -test_expect_failure 'unpack-sideband: packet_reader_read() consumes sideband, chomp payload' '
100 +test_expect_success 'unpack-sideband: packet_reader_read() consumes sideband, chomp payload' '
101 test_when_finished "rm -f expect-out expect-err" &&
102 test-tool pkt-line send-split-sideband >split-sideband &&
103 test-tool pkt-line unpack-sideband \