object-file: drop OBJECT_INFO_ALLOW_UNKNOWN_TYPE flag

Since cat-file dropped its "--allow-unknown-type" option in the previous
commit, there are no more uses of the internal flag that implemented it.
Let's drop it.

That in turn lets us drop the strbuf parameter of unpack_loose_header(),
which now is always NULL. And without that, we can drop all of the
additional code to inflate larger headers into the strbuf.

Arguably we could drop ULHR_TOO_LONG, as no callers really care about
the distinction from ULHR_BAD. But it's easy enough to retain, and it
does let us produce a slightly more specific message in one instance.

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Jeff King
2025-05-16 00:49:45 -04:00
committed by Junio C Hamano
parent f227fc7d43
commit ae24b032a0
4 changed files with 10 additions and 49 deletions

View File

@@ -299,8 +299,7 @@ enum unpack_loose_header_result unpack_loose_header(git_zstream *stream,
unsigned char *map, unsigned char *map,
unsigned long mapsize, unsigned long mapsize,
void *buffer, void *buffer,
unsigned long bufsiz, unsigned long bufsiz)
struct strbuf *header)
{ {
int status; int status;
@@ -325,32 +324,9 @@ enum unpack_loose_header_result unpack_loose_header(git_zstream *stream,
return ULHR_OK; return ULHR_OK;
/* /*
* We have a header longer than MAX_HEADER_LEN. The "header" * We have a header longer than MAX_HEADER_LEN.
* here is only non-NULL when we run "cat-file
* --allow-unknown-type".
*/ */
if (!header) return ULHR_TOO_LONG;
return ULHR_TOO_LONG;
/*
* buffer[0..bufsiz] was not large enough. Copy the partial
* result out to header, and then append the result of further
* reading the stream.
*/
strbuf_add(header, buffer, stream->next_out - (unsigned char *)buffer);
do {
stream->next_out = buffer;
stream->avail_out = bufsiz;
obj_read_unlock();
status = git_inflate(stream, 0);
obj_read_lock();
strbuf_add(header, buffer, stream->next_out - (unsigned char *)buffer);
if (memchr(buffer, '\0', stream->next_out - (unsigned char *)buffer))
return 0;
} while (status == Z_OK);
return ULHR_BAD;
} }
static void *unpack_loose_rest(git_zstream *stream, static void *unpack_loose_rest(git_zstream *stream,
@@ -476,10 +452,8 @@ int loose_object_info(struct repository *r,
void *map; void *map;
git_zstream stream; git_zstream stream;
char hdr[MAX_HEADER_LEN]; char hdr[MAX_HEADER_LEN];
struct strbuf hdrbuf = STRBUF_INIT;
unsigned long size_scratch; unsigned long size_scratch;
enum object_type type_scratch; enum object_type type_scratch;
int allow_unknown = flags & OBJECT_INFO_ALLOW_UNKNOWN_TYPE;
if (oi->delta_base_oid) if (oi->delta_base_oid)
oidclr(oi->delta_base_oid, the_repository->hash_algo); oidclr(oi->delta_base_oid, the_repository->hash_algo);
@@ -521,18 +495,15 @@ int loose_object_info(struct repository *r,
if (oi->disk_sizep) if (oi->disk_sizep)
*oi->disk_sizep = mapsize; *oi->disk_sizep = mapsize;
switch (unpack_loose_header(&stream, map, mapsize, hdr, sizeof(hdr), switch (unpack_loose_header(&stream, map, mapsize, hdr, sizeof(hdr))) {
allow_unknown ? &hdrbuf : NULL)) {
case ULHR_OK: case ULHR_OK:
if (parse_loose_header(hdrbuf.len ? hdrbuf.buf : hdr, oi) < 0) if (parse_loose_header(hdr, oi) < 0)
status = error(_("unable to parse %s header"), oid_to_hex(oid)); status = error(_("unable to parse %s header"), oid_to_hex(oid));
else if (!allow_unknown && *oi->typep < 0) else if (*oi->typep < 0)
die(_("invalid object type")); die(_("invalid object type"));
if (!oi->contentp) if (!oi->contentp)
break; break;
if (hdrbuf.len)
BUG("unpacking content with unknown types not yet supported");
*oi->contentp = unpack_loose_rest(&stream, hdr, *oi->sizep, oid); *oi->contentp = unpack_loose_rest(&stream, hdr, *oi->sizep, oid);
if (*oi->contentp) if (*oi->contentp)
goto cleanup; goto cleanup;
@@ -558,7 +529,6 @@ cleanup:
munmap(map, mapsize); munmap(map, mapsize);
if (oi->sizep == &size_scratch) if (oi->sizep == &size_scratch)
oi->sizep = NULL; oi->sizep = NULL;
strbuf_release(&hdrbuf);
if (oi->typep == &type_scratch) if (oi->typep == &type_scratch)
oi->typep = NULL; oi->typep = NULL;
oi->whence = OI_LOOSE; oi->whence = OI_LOOSE;
@@ -1682,8 +1652,7 @@ int read_loose_object(const char *path,
goto out; goto out;
} }
if (unpack_loose_header(&stream, map, mapsize, hdr, sizeof(hdr), if (unpack_loose_header(&stream, map, mapsize, hdr, sizeof(hdr)) != ULHR_OK) {
NULL) != ULHR_OK) {
error(_("unable to unpack header of %s"), path); error(_("unable to unpack header of %s"), path);
goto out_inflate; goto out_inflate;
} }

View File

@@ -133,12 +133,7 @@ int format_object_header(char *str, size_t size, enum object_type type,
* - ULHR_BAD on error * - ULHR_BAD on error
* - ULHR_TOO_LONG if the header was too long * - ULHR_TOO_LONG if the header was too long
* *
* It will only parse up to MAX_HEADER_LEN bytes unless an optional * It will only parse up to MAX_HEADER_LEN bytes.
* "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(), ULHR_TOO_LONG will still be returned
* from this function to indicate that the header was too long.
*/ */
enum unpack_loose_header_result { enum unpack_loose_header_result {
ULHR_OK, ULHR_OK,
@@ -149,8 +144,7 @@ enum unpack_loose_header_result unpack_loose_header(git_zstream *stream,
unsigned char *map, unsigned char *map,
unsigned long mapsize, unsigned long mapsize,
void *buffer, void *buffer,
unsigned long bufsiz, unsigned long bufsiz);
struct strbuf *hdrbuf);
/** /**
* parse_loose_header() parses the starting "<type> <len>\0" of an * parse_loose_header() parses the starting "<type> <len>\0" of an

View File

@@ -240,8 +240,6 @@ struct object_info {
/* Invoke lookup_replace_object() on the given hash */ /* Invoke lookup_replace_object() on the given hash */
#define OBJECT_INFO_LOOKUP_REPLACE 1 #define OBJECT_INFO_LOOKUP_REPLACE 1
/* Allow reading from a loose object file of unknown/bogus type */
#define OBJECT_INFO_ALLOW_UNKNOWN_TYPE 2
/* Do not retry packed storage after checking packed and loose storage */ /* Do not retry packed storage after checking packed and loose storage */
#define OBJECT_INFO_QUICK 8 #define OBJECT_INFO_QUICK 8
/* /*

View File

@@ -238,7 +238,7 @@ static int open_istream_loose(struct git_istream *st, struct repository *r,
return -1; return -1;
switch (unpack_loose_header(&st->z, st->u.loose.mapped, switch (unpack_loose_header(&st->z, st->u.loose.mapped,
st->u.loose.mapsize, st->u.loose.hdr, st->u.loose.mapsize, st->u.loose.hdr,
sizeof(st->u.loose.hdr), NULL)) { sizeof(st->u.loose.hdr))) {
case ULHR_OK: case ULHR_OK:
break; break;
case ULHR_BAD: case ULHR_BAD: