From 5d2990fd4db73dfe2726d40882055703d81e52b0 Mon Sep 17 00:00:00 2001 From: Han Young Date: Thu, 12 Feb 2026 15:20:02 +0800 Subject: [PATCH] diffcore-break: prevent dangling pointer After we have freed the file pair, we should set the queue reference to null. This prevents us from encountering a dangling pointer later on. The test uses git reset to trigger prefetching after break-rewrites have freed the file pair. Signed-off-by: Han Young Signed-off-by: Junio C Hamano --- diffcore-break.c | 1 + t/t4067-diff-partial-clone.sh | 29 +++++++++++++++++++++++++++++ 2 files changed, 30 insertions(+) diff --git a/diffcore-break.c b/diffcore-break.c index c4c2173f30..9b11fe2fa0 100644 --- a/diffcore-break.c +++ b/diffcore-break.c @@ -222,6 +222,7 @@ void diffcore_break(struct repository *r, int break_score) free(p); /* not diff_free_filepair(), we are * reusing one and two here. */ + q->queue[i] = NULL; continue; } } diff --git a/t/t4067-diff-partial-clone.sh b/t/t4067-diff-partial-clone.sh index 72f25de449..61c71ada16 100755 --- a/t/t4067-diff-partial-clone.sh +++ b/t/t4067-diff-partial-clone.sh @@ -132,6 +132,35 @@ test_expect_success 'diff with rename detection batches blobs' ' test_line_count = 1 done_lines ' +test_expect_success 'diff succeeds even if prefetch triggered by break-rewrites' ' + test_when_finished "rm -rf server client trace" && + + test_create_repo server && + echo xyz >server/foo && + mkdir server/bar && + test_seq -f "line %d" 1 100 >server/bar/baz && + git -C server add -A && + git -C server commit -m x && + + echo xyzz >server/foo && + rm server/bar/baz && + test_seq -f "line %d" 90 190 >server/bar/baz && + git -C server add -A && + git -C server commit -m x && + + test_config -C server uploadpack.allowfilter 1 && + test_config -C server uploadpack.allowanysha1inwant 1 && + git clone --filter=blob:limit=0 "file://$(pwd)/server" client && + + # Fetch bar/baz without fetching foo. + git -C client checkout HEAD~1 bar && + # Ensure baz has diff + git -C client reset --hard HEAD && + + # break-rewrites detection in reset will trigger prefetch + git -C client reset HEAD~1 +' + test_expect_success 'diff succeeds even if entries are removed from queue' ' test_when_finished "rm -rf server client trace" &&