From 8174627b3d32dc80cb477b3fa46971955f26c6b2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C4=90o=C3=A0n=20Tr=E1=BA=A7n=20C=C3=B4ng=20Danh?= Date: Sun, 22 Aug 2021 15:49:08 +0700 Subject: diff-lib: ignore paths that are outside $cwd if --relative asked MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit For diff family commands, we can tell them to exclude changes outside of some directories if --relative is requested. In diff_unmerge(), NULL will be returned if the requested path is outside of the interesting directories, thus we'll run into NULL pointer dereference in run_diff_files when trying to dereference its return value. Checking for return value of diff_unmerge before dereferencing is not sufficient, though. Since, diff engine will try to work on such pathspec later. Let's not run diff on those unintesting entries, instead. As a side effect, by skipping like that, we can save some CPU cycles. Reported-by: Thomas De Zeeuw Tested-by: Carlo Arenas Signed-off-by: Đoàn Trần Công Danh Signed-off-by: Junio C Hamano --- diff-lib.c | 4 ++++ 1 file changed, 4 insertions(+) (limited to 'diff-lib.c') diff --git a/diff-lib.c b/diff-lib.c index b73cc1859a..b0c383647d 100644 --- a/diff-lib.c +++ b/diff-lib.c @@ -116,6 +116,10 @@ int run_diff_files(struct rev_info *revs, unsigned int option) if (!ce_path_match(istate, ce, &revs->prune_data, NULL)) continue; + if (revs->diffopt.prefix && + strncmp(ce->name, revs->diffopt.prefix, revs->diffopt.prefix_length)) + continue; + if (ce_stage(ce)) { struct combine_diff_path *dpath; struct diff_filepair *pair; -- cgit v1.2.3