[BUG] remote.c/match_explicit() ... NULL pointer dereferenciation (git 1.5.3.4)
From: Melchior FRANZ <hidden>
Date: 2016-06-15 22:43:45
Hi,
I'm mucking around with git while implementing a simple, flat
CVS gateway. For tests I created a local remote clone via
"git remote add -f -t master -m master origin /local/path"
(as described on the git-remote man-page). When running a
(wrong) command like "git push origin foo", whereby "foo"
is nowhere defined in the refspec list:
[remote "origin"]
url = /local/path
fetch = +refs/heads/master:refs/remotes/origin/master
push = +master:refs/heads/sync
then git-send-pack segfaults in remote.c/count_refspec_match
in the strlen() function, because "pattern" contains garbage.
And this is because in match_explicit() we have these lines:
if (!matched_src)
errs = 1;
if (dst_value == NULL)
dst_value = matched_src->name;
<<- gdb prints from here
and with the unknown refspec "foo" both dst_value and matched_src
are zero:
(gdb) print dst_value
$1 = 0x0
(gdb) print *rs
$2 = {
force = 0,
pattern = 0,
src = 0x808d680 "foo",
dst = 0x0
}
(gdb) print matched_src
$3 = (struct ref *) 0x0
(gdb) print dst_value
$4 = 0x34 <Address 0x34 out of bounds>
No idea, why the NULL-pointer dereferenciation doesn't segfault
right away, but assigns 0x34 to dst_value. Compiler bug?
m.
Spec:
Linux 2.6.23.1 x86/P4
gcc 4.2.1 (SUSE Linux) (openSuSE 10.3)
libc 2.6.1 (20070803)
git 1.5.3.4 (compiled with -g -O0)