From: Derrick Stolee <dstolee@xxxxxxxxxxxxx> The previous change introduced read_table_of_contents() in the chunk-format API, but dropped the duplicate chunk check from the commit-graph parsing logic. This was done to keep flexibility in the chunk-format API. One way to restore this check is to have each chunk_read_fn method check if it has run before. This is somewhat repetitive. If we determine that the chunk-format API would be better off with a hard requirement that chunks are never repeated, then this could be replaced with a check in chunk-format.c. For now, only restore the duplicate checks that previously existed in the commit-graph parsing logic. Signed-off-by: Derrick Stolee <dstolee@xxxxxxxxxxxxx> --- commit-graph.c | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/commit-graph.c b/commit-graph.c index 0a3ba147df..c0102fceba 100644 --- a/commit-graph.c +++ b/commit-graph.c @@ -289,10 +289,20 @@ static int verify_commit_graph_lite(struct commit_graph *g) return 0; } +static int report_duplicate(void) +{ + warning(_("duplicate chunk detected")); + return 1; +} + static int graph_read_oid_fanout(const unsigned char *chunk_start, size_t chunk_size, void *data) { struct commit_graph *g = (struct commit_graph *)data; + + if (g->chunk_oid_fanout) + return report_duplicate(); + g->chunk_oid_fanout = (uint32_t*)chunk_start; return 0; } @@ -301,6 +311,10 @@ static int graph_read_oid_lookup(const unsigned char *chunk_start, size_t chunk_size, void *data) { struct commit_graph *g = (struct commit_graph *)data; + + if (g->chunk_oid_lookup) + return report_duplicate(); + g->chunk_oid_lookup = chunk_start; g->num_commits = chunk_size / g->hash_len; return 0; @@ -310,6 +324,10 @@ static int graph_read_data(const unsigned char *chunk_start, size_t chunk_size, void *data) { struct commit_graph *g = (struct commit_graph *)data; + + if (g->chunk_commit_data) + return report_duplicate(); + g->chunk_commit_data = chunk_start; return 0; } @@ -318,6 +336,10 @@ static int graph_read_extra_edges(const unsigned char *chunk_start, size_t chunk_size, void *data) { struct commit_graph *g = (struct commit_graph *)data; + + if (g->chunk_extra_edges) + return report_duplicate(); + g->chunk_extra_edges = chunk_start; return 0; } @@ -326,6 +348,10 @@ static int graph_read_base_graphs(const unsigned char *chunk_start, size_t chunk_size, void *data) { struct commit_graph *g = (struct commit_graph *)data; + + if (g->chunk_base_graphs) + return report_duplicate(); + g->chunk_base_graphs = chunk_start; return 0; } @@ -334,6 +360,10 @@ static int graph_read_bloom_indices(const unsigned char *chunk_start, size_t chunk_size, void *data) { struct commit_graph *g = (struct commit_graph *)data; + + if (g->chunk_bloom_indexes) + return report_duplicate(); + g->chunk_bloom_indexes = chunk_start; return 0; } @@ -343,6 +373,10 @@ static int graph_read_bloom_data(const unsigned char *chunk_start, { struct commit_graph *g = (struct commit_graph *)data; uint32_t hash_version; + + if (g->chunk_bloom_data) + return report_duplicate(); + g->chunk_bloom_data = chunk_start; hash_version = get_be32(chunk_start); -- gitgitgadget