upload-pack: handle unexpected delim packets
When processing the arguments list for a v2 ls-refs or fetch command, we
loop like this:
while (packet_reader_read(request) != PACKET_READ_FLUSH) {
const char *arg = request->line;
...handle arg...
}
to read and handle packets until we see a flush. The hidden assumption
here is that anything except PACKET_READ_FLUSH will give us valid packet
data to read. But that's not true; PACKET_READ_DELIM or PACKET_READ_EOF
will leave packet->line as NULL, and we'll segfault trying to look at
it.
Instead, we should follow the more careful model demonstrated on the
client side (e.g., in process_capabilities_v2): keep looping as long
as we get normal packets, and then make sure that we broke out of the
loop due to a real flush. That fixes the segfault and correctly
diagnoses any unexpected input from the client.
Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
committed by
Junio C Hamano
parent
88124ab263
commit
4845b77245
@ -1252,7 +1252,7 @@ static void process_args(struct packet_reader *request,
|
||||
struct upload_pack_data *data,
|
||||
struct object_array *want_obj)
|
||||
{
|
||||
while (packet_reader_read(request) != PACKET_READ_FLUSH) {
|
||||
while (packet_reader_read(request) == PACKET_READ_NORMAL) {
|
||||
const char *arg = request->line;
|
||||
const char *p;
|
||||
|
||||
@ -1321,6 +1321,9 @@ static void process_args(struct packet_reader *request,
|
||||
/* ignore unknown lines maybe? */
|
||||
die("unexpected line: '%s'", arg);
|
||||
}
|
||||
|
||||
if (request->status != PACKET_READ_FLUSH)
|
||||
die(_("expected flush after fetch arguments"));
|
||||
}
|
||||
|
||||
static int process_haves(struct oid_array *haves, struct oid_array *common,
|
||||
|
||||
Reference in New Issue
Block a user