Skip to content

Commit

Permalink
smart_pkt: treat empty packet lines as error
Browse files Browse the repository at this point in the history
The Git protocol does not specify what should happen in the case
of an empty packet line (that is a packet line "0004"). We
currently indicate success, but do not return a packet in the
case where we hit an empty line. The smart protocol was not
prepared to handle such packets in all cases, though, resulting
in a `NULL` pointer dereference.

Fix the issue by returning an error instead. As such kind of
packets is not even specified by upstream, this is the right
thing to do.
  • Loading branch information
pks-t authored and Edward Thomson committed Jan 6, 2017
1 parent 66e3774 commit 2fdef64
Show file tree
Hide file tree
Showing 2 changed files with 5 additions and 16 deletions.
10 changes: 5 additions & 5 deletions src/transports/smart_pkt.c
Original file line number Diff line number Diff line change
Expand Up @@ -437,13 +437,13 @@ int git_pkt_parse_line(

line += PKT_LEN_SIZE;
/*
* TODO: How do we deal with empty lines? Try again? with the next
* line?
* The Git protocol does not specify empty lines as part
* of the protocol. Not knowing what to do with an empty
* line, we should return an error upon hitting one.
*/
if (len == PKT_LEN_SIZE) {
*head = NULL;
*out = line;
return 0;
giterr_set_str(GITERR_NET, "Invalid empty packet");
return GIT_ERROR;
}

if (len == 0) { /* Flush pkt */
Expand Down
11 changes: 0 additions & 11 deletions src/transports/smart_protocol.c
Original file line number Diff line number Diff line change
Expand Up @@ -763,14 +763,6 @@ static int add_push_report_sideband_pkt(git_push *push, git_pkt_data *data_pkt,
line_len -= (line_end - line);
line = line_end;

/* When a valid packet with no content has been
* read, git_pkt_parse_line does not report an
* error, but the pkt pointer has not been set.
* Handle this by skipping over empty packets.
*/
if (pkt == NULL)
continue;

error = add_push_report_pkt(push, pkt);

git_pkt_free(pkt);
Expand Down Expand Up @@ -825,9 +817,6 @@ static int parse_report(transport_smart *transport, git_push *push)

error = 0;

if (pkt == NULL)
continue;

switch (pkt->type) {
case GIT_PKT_DATA:
/* This is a sideband packet which contains other packets */
Expand Down

0 comments on commit 2fdef64

Please sign in to comment.