Skip to content

Commit

Permalink
object-file.c: return ULHR_TOO_LONG on "header too long"
Browse files Browse the repository at this point in the history
Split up the return code for "header too long" from the generic
negative return value unpack_loose_header() returns, and report via
error() if we exceed MAX_HEADER_LEN.

As a test added earlier in this series in t1006-cat-file.sh shows
we'll correctly emit zlib errors from zlib.c already in this case, so
we have no need to carry those return codes further down the
stack. Let's instead just return ULHR_TOO_LONG saying we ran into the
MAX_HEADER_LEN limit, or other negative values for "unable to unpack
<OID> header".

Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
  • Loading branch information
avar authored and gitster committed Oct 1, 2021
1 parent 3b6a8db commit 5848fb1
Show file tree
Hide file tree
Showing 4 changed files with 13 additions and 5 deletions.
5 changes: 4 additions & 1 deletion cache.h
Original file line number Diff line number Diff line change
Expand Up @@ -1311,16 +1311,19 @@ int git_open_cloexec(const char *name, int flags);
*
* - ULHR_OK on success
* - ULHR_BAD on error
* - ULHR_TOO_LONG if the header was too long
*
* It will only parse up to MAX_HEADER_LEN bytes unless an optional
* "hdrbuf" argument is non-NULL. This is intended for use with
* OBJECT_INFO_ALLOW_UNKNOWN_TYPE to extract the bad type for (error)
* reporting. The full header will be extracted to "hdrbuf" for use
* with parse_loose_header().
* with parse_loose_header(), ULHR_TOO_LONG will still be returned
* from this function to indicate that the header was too long.
*/
enum unpack_loose_header_result {
ULHR_OK,
ULHR_BAD,
ULHR_TOO_LONG,
};
enum unpack_loose_header_result unpack_loose_header(git_zstream *stream,
unsigned char *map,
Expand Down
8 changes: 6 additions & 2 deletions object-file.c
Original file line number Diff line number Diff line change
Expand Up @@ -1245,7 +1245,7 @@ enum unpack_loose_header_result unpack_loose_header(git_zstream *stream,
* --allow-unknown-type".
*/
if (!header)
return ULHR_BAD;
return ULHR_TOO_LONG;

/*
* buffer[0..bufsiz] was not large enough. Copy the partial
Expand All @@ -1266,7 +1266,7 @@ enum unpack_loose_header_result unpack_loose_header(git_zstream *stream,
stream->next_out = buffer;
stream->avail_out = bufsiz;
} while (status != Z_STREAM_END);
return ULHR_BAD;
return ULHR_TOO_LONG;
}

static void *unpack_loose_rest(git_zstream *stream,
Expand Down Expand Up @@ -1439,6 +1439,10 @@ static int loose_object_info(struct repository *r,
status = error(_("unable to unpack %s header"),
oid_to_hex(oid));
break;
case ULHR_TOO_LONG:
status = error(_("header for %s too long, exceeds %d bytes"),
oid_to_hex(oid), MAX_HEADER_LEN);
break;
}

if (status < 0) {
Expand Down
1 change: 1 addition & 0 deletions streaming.c
Original file line number Diff line number Diff line change
Expand Up @@ -235,6 +235,7 @@ static int open_istream_loose(struct git_istream *st, struct repository *r,
case ULHR_OK:
break;
case ULHR_BAD:
case ULHR_TOO_LONG:
goto error;
}
if (parse_loose_header(st->u.loose.hdr, &oi, 0) < 0)
Expand Down
4 changes: 2 additions & 2 deletions t/t1006-cat-file.sh
Original file line number Diff line number Diff line change
Expand Up @@ -356,12 +356,12 @@ do
if test "$arg2" = "-p"
then
cat >expect <<-EOF
error: unable to unpack $bogus_long_sha1 header
error: header for $bogus_long_sha1 too long, exceeds 32 bytes
fatal: Not a valid object name $bogus_long_sha1
EOF
else
cat >expect <<-EOF
error: unable to unpack $bogus_long_sha1 header
error: header for $bogus_long_sha1 too long, exceeds 32 bytes
fatal: git cat-file: could not get object info
EOF
fi &&
Expand Down

0 comments on commit 5848fb1

Please sign in to comment.