Stop using `the_hash_algo` as it implicitly relies on `the_repository`. Instead, we either use the hash algo provided via the context or, if there is no such hash algo, we use `the_repository` explicitly. Such uses will be removed in subsequent commits. Signed-off-by: Patrick Steinhardt <ps@xxxxxx> --- builtin/commit-graph.c | 3 ++- commit-graph.c | 40 +++++++++++++++++++++------------------- commit-graph.h | 4 +++- oss-fuzz/fuzz-commit-graph.c | 4 +++- 4 files changed, 29 insertions(+), 22 deletions(-) diff --git a/builtin/commit-graph.c b/builtin/commit-graph.c index 145802afb79..680b03a83a8 100644 --- a/builtin/commit-graph.c +++ b/builtin/commit-graph.c @@ -108,7 +108,8 @@ static int graph_verify(int argc, const char **argv, const char *prefix, opened = OPENED_GRAPH; else if (errno != ENOENT) die_errno(_("Could not open commit-graph '%s'"), graph_name); - else if (open_commit_graph_chain(chain_name, &fd, &st)) + else if (open_commit_graph_chain(chain_name, &fd, &st, + the_repository->hash_algo)) opened = OPENED_CHAIN; else if (errno != ENOENT) die_errno(_("could not open commit-graph chain '%s'"), chain_name); diff --git a/commit-graph.c b/commit-graph.c index 9c2278dd7a1..b3feb6dfd77 100644 --- a/commit-graph.c +++ b/commit-graph.c @@ -263,7 +263,7 @@ struct commit_graph *load_commit_graph_one_fd_st(struct repository *r, graph_size = xsize_t(st->st_size); - if (graph_size < graph_min_size(the_hash_algo)) { + if (graph_size < graph_min_size(r->hash_algo)) { close(fd); error(_("commit-graph file is too small")); return NULL; @@ -271,7 +271,7 @@ struct commit_graph *load_commit_graph_one_fd_st(struct repository *r, graph_map = xmmap(NULL, graph_size, PROT_READ, MAP_PRIVATE, fd, 0); close(fd); prepare_repo_settings(r); - ret = parse_commit_graph(&r->settings, graph_map, graph_size); + ret = parse_commit_graph(&r->settings, r->hash_algo, graph_map, graph_size); if (ret) ret->odb_source = source; @@ -319,7 +319,7 @@ static int graph_read_commit_data(const unsigned char *chunk_start, size_t chunk_size, void *data) { struct commit_graph *g = data; - if (chunk_size / graph_data_width(the_hash_algo) != g->num_commits) + if (chunk_size / graph_data_width(g->hash_algo) != g->num_commits) return error(_("commit-graph commit data chunk is wrong size")); g->chunk_commit_data = chunk_start; return 0; @@ -373,6 +373,7 @@ static int graph_read_bloom_data(const unsigned char *chunk_start, } struct commit_graph *parse_commit_graph(struct repo_settings *s, + const struct git_hash_algo *hash_algo, void *graph_map, size_t graph_size) { const unsigned char *data; @@ -384,7 +385,7 @@ struct commit_graph *parse_commit_graph(struct repo_settings *s, if (!graph_map) return NULL; - if (graph_size < graph_min_size(the_hash_algo)) + if (graph_size < graph_min_size(hash_algo)) return NULL; data = (const unsigned char *)graph_map; @@ -404,22 +405,22 @@ struct commit_graph *parse_commit_graph(struct repo_settings *s, } hash_version = *(unsigned char*)(data + 5); - if (hash_version != oid_version(the_hash_algo)) { + if (hash_version != oid_version(hash_algo)) { error(_("commit-graph hash version %X does not match version %X"), - hash_version, oid_version(the_hash_algo)); + hash_version, oid_version(hash_algo)); return NULL; } graph = alloc_commit_graph(); - graph->hash_algo = the_hash_algo; + graph->hash_algo = hash_algo; graph->num_chunks = *(unsigned char*)(data + 6); graph->data = graph_map; graph->data_len = graph_size; if (graph_size < GRAPH_HEADER_SIZE + (graph->num_chunks + 1) * CHUNK_TOC_ENTRY_SIZE + - GRAPH_FANOUT_SIZE + the_hash_algo->rawsz) { + GRAPH_FANOUT_SIZE + hash_algo->rawsz) { error(_("commit-graph file is too small to hold %u chunks"), graph->num_chunks); free(graph); @@ -618,7 +619,8 @@ static int add_graph_to_chain(struct commit_graph *g, } int open_commit_graph_chain(const char *chain_file, - int *fd, struct stat *st) + int *fd, struct stat *st, + const struct git_hash_algo *hash_algo) { *fd = git_open(chain_file); if (*fd < 0) @@ -627,7 +629,7 @@ int open_commit_graph_chain(const char *chain_file, close(*fd); return 0; } - if (st->st_size < (ssize_t) the_hash_algo->hexsz) { + if (st->st_size < (ssize_t) hash_algo->hexsz) { close(*fd); if (!st->st_size) { /* treat empty files the same as missing */ @@ -652,7 +654,7 @@ struct commit_graph *load_commit_graph_chain_fd_st(struct repository *r, FILE *fp = xfdopen(fd, "r"); size_t count; - count = st->st_size / (the_hash_algo->hexsz + 1); + count = st->st_size / (r->hash_algo->hexsz + 1); CALLOC_ARRAY(oids, count); odb_prepare_alternates(r->objects); @@ -714,7 +716,7 @@ static struct commit_graph *load_commit_graph_chain(struct repository *r, int fd; struct commit_graph *g = NULL; - if (open_commit_graph_chain(chain_file, &fd, &st)) { + if (open_commit_graph_chain(chain_file, &fd, &st, r->hash_algo)) { int incomplete; /* ownership of fd is taken over by load function */ g = load_commit_graph_chain_fd_st(r, fd, &st, &incomplete); @@ -906,7 +908,7 @@ static void fill_commit_graph_info(struct commit *item, struct commit_graph *g, die(_("invalid commit position. commit-graph is likely corrupt")); lex_index = pos - g->num_commits_in_base; - commit_data = g->chunk_commit_data + st_mult(graph_data_width(the_hash_algo), lex_index); + commit_data = g->chunk_commit_data + st_mult(graph_data_width(g->hash_algo), lex_index); graph_data = commit_graph_data_at(item); graph_data->graph_pos = pos; @@ -1110,7 +1112,7 @@ static struct tree *load_tree_for_commit(struct repository *r, g = g->base_graph; commit_data = g->chunk_commit_data + - st_mult(graph_data_width(the_hash_algo), + st_mult(graph_data_width(g->hash_algo), graph_pos - g->num_commits_in_base); oidread(&oid, commit_data, the_repository->hash_algo); @@ -1220,7 +1222,7 @@ static int write_graph_chunk_oids(struct hashfile *f, for (count = 0; count < ctx->commits.nr; count++, list++) { display_progress(ctx->progress, ++ctx->progress_cnt); - hashwrite(f, (*list)->object.oid.hash, the_hash_algo->rawsz); + hashwrite(f, (*list)->object.oid.hash, f->algop->rawsz); } return 0; @@ -1251,7 +1253,7 @@ static int write_graph_chunk_data(struct hashfile *f, die(_("unable to parse commit %s"), oid_to_hex(&(*list)->object.oid)); tree = get_commit_tree_oid(*list); - hashwrite(f, tree->hash, the_hash_algo->rawsz); + hashwrite(f, tree->hash, ctx->r->hash_algo->rawsz); parent = (*list)->parents; @@ -2033,7 +2035,7 @@ static size_t write_graph_chunk_base_1(struct hashfile *f, return 0; num = write_graph_chunk_base_1(f, g->base_graph); - hashwrite(f, g->oid.hash, the_hash_algo->rawsz); + hashwrite(f, g->oid.hash, g->hash_algo->rawsz); return num + 1; } @@ -2057,7 +2059,7 @@ static int write_commit_graph_file(struct write_commit_graph_context *ctx) struct hashfile *f; struct tempfile *graph_layer; /* when ctx->split is non-zero */ struct lock_file lk = LOCK_INIT; - const unsigned hashsz = the_hash_algo->rawsz; + const unsigned hashsz = ctx->r->hash_algo->rawsz; struct strbuf progress_title = STRBUF_INIT; struct chunkfile *cf; unsigned char file_hash[GIT_MAX_RAWSZ]; @@ -2145,7 +2147,7 @@ static int write_commit_graph_file(struct write_commit_graph_context *ctx) hashwrite_be32(f, GRAPH_SIGNATURE); hashwrite_u8(f, GRAPH_VERSION); - hashwrite_u8(f, oid_version(the_hash_algo)); + hashwrite_u8(f, oid_version(ctx->r->hash_algo)); hashwrite_u8(f, get_num_chunks(cf)); hashwrite_u8(f, ctx->num_commit_graphs_after - 1); diff --git a/commit-graph.h b/commit-graph.h index f20d28ff3a0..f26881849d6 100644 --- a/commit-graph.h +++ b/commit-graph.h @@ -32,7 +32,8 @@ struct string_list; char *get_commit_graph_filename(struct odb_source *source); char *get_commit_graph_chain_filename(struct odb_source *source); int open_commit_graph(const char *graph_file, int *fd, struct stat *st); -int open_commit_graph_chain(const char *chain_file, int *fd, struct stat *st); +int open_commit_graph_chain(const char *chain_file, int *fd, struct stat *st, + const struct git_hash_algo *hash_algo); /* * Given a commit struct, try to fill the commit struct info, including: @@ -129,6 +130,7 @@ struct repo_settings; * prior to calling parse_commit_graph(). */ struct commit_graph *parse_commit_graph(struct repo_settings *s, + const struct git_hash_algo *hash_algo, void *graph_map, size_t graph_size); /* diff --git a/oss-fuzz/fuzz-commit-graph.c b/oss-fuzz/fuzz-commit-graph.c index fbb77fec197..879072f9d3c 100644 --- a/oss-fuzz/fuzz-commit-graph.c +++ b/oss-fuzz/fuzz-commit-graph.c @@ -5,6 +5,7 @@ #include "repository.h" struct commit_graph *parse_commit_graph(struct repo_settings *s, + const struct git_hash_algo *hash_algo, void *graph_map, size_t graph_size); int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size); @@ -24,7 +25,8 @@ int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) repo_set_hash_algo(the_repository, GIT_HASH_SHA1); the_repository->settings.commit_graph_generation_version = 2; the_repository->settings.commit_graph_changed_paths_version = 1; - g = parse_commit_graph(&the_repository->settings, (void *)data, size); + g = parse_commit_graph(&the_repository->settings, the_repository->hash_algo, + (void *)data, size); repo_clear(the_repository); free_commit_graph(g); -- 2.50.1.723.g3e08bea96f.dirty