Skip to content

Commit

Permalink
pkt-line: do not chomp newlines for sideband messages
Browse files Browse the repository at this point in the history
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 <[email protected]>
Helped-by: Oswald Buddenhagen <[email protected]>
Signed-off-by: Jiang Xin <[email protected]>
Signed-off-by: Junio C Hamano <[email protected]>
  • Loading branch information
jiangxin authored and gitster committed Dec 18, 2023
1 parent 64220dc commit 7033d54
Show file tree
Hide file tree
Showing 3 changed files with 31 additions and 3 deletions.
31 changes: 29 additions & 2 deletions pkt-line.c
Original file line number Diff line number Diff line change
Expand Up @@ -462,8 +462,32 @@ enum packet_read_status packet_read_with_status(int fd, char **src_buffer,
}

if ((options & PACKET_READ_CHOMP_NEWLINE) &&
len && buffer[len-1] == '\n')
len--;
len && buffer[len-1] == '\n') {
if (options & PACKET_READ_USE_SIDEBAND) {
int band = *buffer & 0xff;
switch (band) {
case 1:
/* Chomp newline for payload */
len--;
break;
case 2:
case 3:
/*
* Do not chomp newline for progress and error
* message.
*/
break;
default:
/*
* Bad sideband, let's leave it to
* demultiplex_sideband() to catch this error.
*/
break;
}
} else {
len--;
}
}

buffer[len] = 0;
if (options & PACKET_READ_REDACT_URI_PATH &&
Expand Down Expand Up @@ -602,6 +626,9 @@ enum packet_read_status packet_reader_read(struct packet_reader *reader)
return reader->status;
}

if (reader->use_sideband)
reader->options |= PACKET_READ_USE_SIDEBAND;

/*
* Consume all progress packets until a primary payload packet is
* received
Expand Down
1 change: 1 addition & 0 deletions pkt-line.h
Original file line number Diff line number Diff line change
Expand Up @@ -85,6 +85,7 @@ void packet_fflush(FILE *f);
#define PACKET_READ_DIE_ON_ERR_PACKET (1u<<2)
#define PACKET_READ_GENTLE_ON_READ_ERROR (1u<<3)
#define PACKET_READ_REDACT_URI_PATH (1u<<4)
#define PACKET_READ_USE_SIDEBAND (1u<<5)
int packet_read(int fd, char *buffer, unsigned size, int options);

/*
Expand Down
2 changes: 1 addition & 1 deletion t/t0070-fundamental.sh
Original file line number Diff line number Diff line change
Expand Up @@ -97,7 +97,7 @@ test_expect_success 'unpack-sideband: packet_reader_read() consumes sideband, no
test_cmp expect-err err
'

test_expect_failure 'unpack-sideband: packet_reader_read() consumes sideband, chomp payload' '
test_expect_success 'unpack-sideband: packet_reader_read() consumes sideband, chomp payload' '
test_when_finished "rm -f expect-out expect-err" &&
test-tool pkt-line send-split-sideband >split-sideband &&
test-tool pkt-line unpack-sideband \
Expand Down

0 comments on commit 7033d54

Please sign in to comment.