Skip to content

Commit 368609b

Browse files
committed
Merge branch 'hy/diff-lazy-fetch-with-break-fix' into seen
A prefetch call can be triggered to access a stale diff_queue entry after diffcore-break breaks a filepair into two and freed the original entry that is no longer used, leading to a segfault, which has been corrected. * hy/diff-lazy-fetch-with-break-fix: SQUASH??? diffcore-break: prevent dangling pointer
2 parents 7c008e0 + caf6105 commit 368609b

File tree

2 files changed

+30
-0
lines changed

2 files changed

+30
-0
lines changed

diffcore-break.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -222,6 +222,7 @@ void diffcore_break(struct repository *r, int break_score)
222222
free(p); /* not diff_free_filepair(), we are
223223
* reusing one and two here.
224224
*/
225+
q->queue[i] = NULL;
225226
continue;
226227
}
227228
}

t/t4067-diff-partial-clone.sh

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,35 @@ test_expect_success 'diff with rename detection batches blobs' '
132132
test_line_count = 1 done_lines
133133
'
134134

135+
test_expect_success 'diff succeeds even if prefetch triggered by break-rewrites' '
136+
test_when_finished "rm -rf server client trace" &&
137+
138+
test_create_repo server &&
139+
echo xyz >server/foo &&
140+
mkdir server/bar &&
141+
test_seq -f "line %d" 1 100 >server/bar/baz &&
142+
git -C server add -A &&
143+
git -C server commit -m x &&
144+
145+
echo xyzz >server/foo &&
146+
rm server/bar/baz &&
147+
test_seq -f "line %d" 90 190 >server/bar/baz &&
148+
git -C server add -A &&
149+
git -C server commit -m x &&
150+
151+
test_config -C server uploadpack.allowfilter 1 &&
152+
test_config -C server uploadpack.allowanysha1inwant 1 &&
153+
git clone --filter=blob:limit=0 "file://$(pwd)/server" client &&
154+
155+
# Fetch bar/baz without fetching foo.
156+
git -C client checkout HEAD~1 bar &&
157+
# Ensure baz has diff
158+
git -C client reset --hard HEAD &&
159+
160+
# break-rewrites detection in reset will trigger prefetch
161+
git -C client reset HEAD~1
162+
'
163+
135164
test_expect_success 'diff succeeds even if entries are removed from queue' '
136165
test_when_finished "rm -rf server client trace" &&
137166

0 commit comments

Comments
 (0)