Skip to content

Commit c834336

Browse files
hanyang-tonygitster
authored andcommitted
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 <hanyang.tony@bytedance.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
1 parent 67ad421 commit c834336

File tree

2 files changed

+31
-0
lines changed

2 files changed

+31
-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: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,36 @@ 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+
146+
echo xyzz >server/foo &&
147+
rm server/bar/baz &&
148+
test_seq -f "line %d" 90 190 >server/bar/baz &&
149+
git -C server add -A &&
150+
git -C server commit -m x &&
151+
152+
test_config -C server uploadpack.allowfilter 1 &&
153+
test_config -C server uploadpack.allowanysha1inwant 1 &&
154+
git clone --filter=blob:limit=0 "file://$(pwd)/server" client &&
155+
156+
# Fetch bar/baz without fetching foo.
157+
git -C client checkout HEAD~1 bar &&
158+
# Ensure baz has diff
159+
git -C client reset --hard HEAD &&
160+
161+
# reset's break-rewrites detection will trigger prefetch
162+
git -C client reset HEAD~1
163+
'
164+
135165
test_expect_success 'diff succeeds even if entries are removed from queue' '
136166
test_when_finished "rm -rf server client trace" &&
137167

0 commit comments

Comments
 (0)