Skip to content

Commit

Permalink
pkt-line: memorize sideband fragment in reader
Browse files Browse the repository at this point in the history
When we turn on the "use_sideband" field of the packet_reader,
"packet_reader_read()" will call the function "demultiplex_sideband()"
to parse and consume sideband messages. Sideband fragment which does not
end with "\r" or "\n" will be saved in the sixth parameter "scratch"
and it can be reused and be concatenated when parsing another sideband
message.

In "packet_reader_read()" function, the local variable "scratch" can
only be reused by subsequent sideband messages. But if there is a
payload message between two sideband fragments, the first fragment
which is saved in the local variable "scratch" will be lost.

To solve this problem, we can add a new field "scratch" in
packet_reader to memorize the sideband fragment across different calls
of "packet_reader_read()".

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 eaa82f8 commit 64220dc
Show file tree
Hide file tree
Showing 3 changed files with 6 additions and 4 deletions.
5 changes: 2 additions & 3 deletions pkt-line.c
Original file line number Diff line number Diff line change
Expand Up @@ -592,12 +592,11 @@ void packet_reader_init(struct packet_reader *reader, int fd,
reader->options = options;
reader->me = "git";
reader->hash_algo = &hash_algos[GIT_HASH_SHA1];
strbuf_init(&reader->scratch, 0);
}

enum packet_read_status packet_reader_read(struct packet_reader *reader)
{
struct strbuf scratch = STRBUF_INIT;

if (reader->line_peeked) {
reader->line_peeked = 0;
return reader->status;
Expand All @@ -620,7 +619,7 @@ enum packet_read_status packet_reader_read(struct packet_reader *reader)
break;
if (demultiplex_sideband(reader->me, reader->status,
reader->buffer, reader->pktlen, 1,
&scratch, &sideband_type))
&reader->scratch, &sideband_type))
break;
}

Expand Down
3 changes: 3 additions & 0 deletions pkt-line.h
Original file line number Diff line number Diff line change
Expand Up @@ -194,6 +194,9 @@ struct packet_reader {

/* hash algorithm in use */
const struct git_hash_algo *hash_algo;

/* hold temporary sideband message */
struct strbuf scratch;
};

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

test_expect_failure 'unpack-sideband: packet_reader_read() consumes sideband, no chomp payload' '
test_expect_success 'unpack-sideband: packet_reader_read() consumes sideband, no 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 64220dc

Please sign in to comment.