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>
This commit is contained in:

committed by
Junio C Hamano

parent
64220dc5f7
commit
7033d5479b
31
pkt-line.c
31
pkt-line.c
@ -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 &&
|
||||
@ -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
|
||||
|
Reference in New Issue
Block a user