Skip to content

Commit 7d02019

Browse files
committed
transports: smart: fix potential invalid memory dereferences
When we receive a packet of exactly four bytes encoding its length as those four bytes it can be treated as an empty line. While it is not really specified how those empty lines should be treated, we currently ignore them and do not return an error when trying to parse it but simply advance the data pointer. Callers invoking `git_pkt_parse_line` are currently not prepared to handle this case as they do not explicitly check this case. While they could always reset the passed out-pointer to `NULL` before calling `git_pkt_parse_line` and determine if the pointer has been set afterwards, it makes more sense to update `git_pkt_parse_line` to set the out-pointer to `NULL` itself when it encounters such an empty packet. Like this it is guaranteed that there will be no invalid memory references to free'd pointers. As such, the issue has been fixed such that `git_pkt_parse_line` always sets the packet out pointer to `NULL` when an empty packet has been received and callers check for this condition, skipping such packets.
1 parent f0ee795 commit 7d02019

File tree

2 files changed

+12
-0
lines changed

2 files changed

+12
-0
lines changed

src/transports/smart_pkt.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -433,6 +433,7 @@ int git_pkt_parse_line(
433433
* line?
434434
*/
435435
if (len == PKT_LEN_SIZE) {
436+
*head = NULL;
436437
*out = line;
437438
return 0;
438439
}

src/transports/smart_protocol.c

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -759,6 +759,14 @@ static int add_push_report_sideband_pkt(git_push *push, git_pkt_data *data_pkt,
759759
line_len -= (line_end - line);
760760
line = line_end;
761761

762+
/* When a valid packet with no content has been
763+
* read, git_pkt_parse_line does not report an
764+
* error, but the pkt pointer has not been set.
765+
* Handle this by skipping over empty packets.
766+
*/
767+
if (pkt == NULL)
768+
continue;
769+
762770
error = add_push_report_pkt(push, pkt);
763771

764772
git_pkt_free(pkt);
@@ -813,6 +821,9 @@ static int parse_report(transport_smart *transport, git_push *push)
813821

814822
error = 0;
815823

824+
if (pkt == NULL)
825+
continue;
826+
816827
switch (pkt->type) {
817828
case GIT_PKT_DATA:
818829
/* This is a sideband packet which contains other packets */

0 commit comments

Comments
 (0)