Merge branch 'ab/fsck-unexpected-type'
"git fsck" has been taught to report mismatch between expected and actual types of an object better. * ab/fsck-unexpected-type: fsck: report invalid object type-path combinations fsck: don't hard die on invalid object types object-file.c: stop dying in parse_loose_header() object-file.c: return ULHR_TOO_LONG on "header too long" object-file.c: use "enum" return type for unpack_loose_header() object-file.c: simplify unpack_loose_short_header() object-file.c: make parse_loose_header_extended() public object-file.c: return -1, not "status" from unpack_loose_header() object-file.c: don't set "typep" when returning non-zero cat-file tests: test for current --allow-unknown-type behavior cat-file tests: add corrupt loose object test cat-file tests: test for missing/bogus object with -t, -s and -p cat-file tests: move bogus_* variable declarations earlier fsck tests: test for garbage appended to a loose object fsck tests: test current hash/type mismatch behavior fsck tests: refactor one test to use a sub-repo fsck tests: add test for fsck-ing an unknown type
This commit is contained in:
45
cache.h
45
cache.h
@ -1268,11 +1268,50 @@ char *xdg_cache_home(const char *filename);
|
||||
|
||||
int git_open_cloexec(const char *name, int flags);
|
||||
#define git_open(name) git_open_cloexec(name, O_RDONLY)
|
||||
int unpack_loose_header(git_zstream *stream, unsigned char *map, unsigned long mapsize, void *buffer, unsigned long bufsiz);
|
||||
int parse_loose_header(const char *hdr, unsigned long *sizep);
|
||||
|
||||
/**
|
||||
* unpack_loose_header() initializes the data stream needed to unpack
|
||||
* a loose object header.
|
||||
*
|
||||
* Returns:
|
||||
*
|
||||
* - 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(), 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,
|
||||
unsigned long mapsize,
|
||||
void *buffer,
|
||||
unsigned long bufsiz,
|
||||
struct strbuf *hdrbuf);
|
||||
|
||||
/**
|
||||
* parse_loose_header() parses the starting "<type> <len>\0" of an
|
||||
* object. If it doesn't follow that format -1 is returned. To check
|
||||
* the validity of the <type> populate the "typep" in the "struct
|
||||
* object_info". It will be OBJ_BAD if the object type is unknown. The
|
||||
* parsed <len> can be retrieved via "oi->sizep", and from there
|
||||
* passed to unpack_loose_rest().
|
||||
*/
|
||||
struct object_info;
|
||||
int parse_loose_header(const char *hdr, struct object_info *oi);
|
||||
|
||||
int check_object_signature(struct repository *r, const struct object_id *oid,
|
||||
void *buf, unsigned long size, const char *type);
|
||||
void *buf, unsigned long size, const char *type,
|
||||
struct object_id *real_oidp);
|
||||
|
||||
int finalize_object_file(const char *tmpfile, const char *filename);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user