Fix buffer overflow in git diff
If PATH_MAX on your system is smaller than a path stored, it may cause buffer overflow and stack corruption in diff_addremove() and diff_change() functions when running git-diff Signed-off-by: Dmitry Potapov <dpotapov@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:

committed by
Junio C Hamano

parent
620e2bb937
commit
fd55a19eb1
@ -171,7 +171,7 @@ int run_diff_files(struct rev_info *revs, unsigned int option)
|
||||
if (silent_on_removed)
|
||||
continue;
|
||||
diff_addremove(&revs->diffopt, '-', ce->ce_mode,
|
||||
ce->sha1, ce->name, NULL);
|
||||
ce->sha1, ce->name);
|
||||
continue;
|
||||
}
|
||||
changed = ce_match_stat(ce, &st, ce_option);
|
||||
@ -184,7 +184,7 @@ int run_diff_files(struct rev_info *revs, unsigned int option)
|
||||
newmode = ce_mode_from_stat(ce, st.st_mode);
|
||||
diff_change(&revs->diffopt, oldmode, newmode,
|
||||
ce->sha1, (changed ? null_sha1 : ce->sha1),
|
||||
ce->name, NULL);
|
||||
ce->name);
|
||||
|
||||
}
|
||||
diffcore_std(&revs->diffopt);
|
||||
@ -208,7 +208,7 @@ static void diff_index_show_file(struct rev_info *revs,
|
||||
const unsigned char *sha1, unsigned int mode)
|
||||
{
|
||||
diff_addremove(&revs->diffopt, prefix[0], mode,
|
||||
sha1, ce->name, NULL);
|
||||
sha1, ce->name);
|
||||
}
|
||||
|
||||
static int get_stat_data(struct cache_entry *ce,
|
||||
@ -312,7 +312,7 @@ static int show_modified(struct oneway_unpack_data *cbdata,
|
||||
return 0;
|
||||
|
||||
diff_change(&revs->diffopt, oldmode, mode,
|
||||
old->sha1, sha1, old->name, NULL);
|
||||
old->sha1, sha1, old->name);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user