Re: [PATCH] Fix mkpath abuse in dwim_ref/sha1_name.c

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Junio C Hamano, Wed, Oct 15, 2008 01:17:52 +0200:
> "Alex Riesen" <raa.lkml@xxxxxxxxx> writes:
> >
> > Otherwise the function sometimes fail to resolve obviously correct refnames,
> > because the string data pointed to by "ref" argument were reused.
> >
> But your patch instead rewrites the computation of str2 by bypassing the
> call to "another_function_that_uses_get_pathname()" and duplicating its
> logic, which I do not think is a viable approach in the longer term.

There is not enough logic to bypass there. It's just a dumb sprintf!
I actually saved a useless call (two, if automatic inlining
optimization doesn't work).

> > diff --git a/sha1_name.c b/sha1_name.c
> > index 41b6809..b5b53bf 100644
> > --- a/sha1_name.c
> > +++ b/sha1_name.c
> > @@ -242,6 +242,7 @@ int dwim_ref(const char *str, int len, unsigned char *sha1, char **ref)
> >  {
> >  	const char **p, *r;
> >  	int refs_found = 0;
> > +	char fullref[PATH_MAX];
> >  
> >  	*ref = NULL;
> >  	for (p = ref_rev_parse_rules; *p; p++) {
> > @@ -249,7 +250,8 @@ int dwim_ref(const char *str, int len, unsigned char *sha1, char **ref)
> >  		unsigned char *this_result;
> >  
> >  		this_result = refs_found ? sha1_from_ref : sha1;
> > -		r = resolve_ref(mkpath(*p, len, str), this_result, 1, NULL);
> > +		snprintf(fullref, sizeof(fullref), *p, len, str);
> > +		r = resolve_ref(fullref, this_result, 1, NULL);
> >  		if (r) {
> >  			if (!refs_found++)
> >  				*ref = xstrdup(r);
> 
> I suspect that I am grossly misleading the code, but I wonder why this xstrdup()
> is not protecting us from the reusing of "the string data pointed to by
> "ref" argument".  Are you fixing the overwriting of the string pointed to
> by "str" argument instead?

Yes, I mistyped. xstrdup's called after the breakage happened.

> What specific call chain has this breakage you found?

That's up to this function from builtin_rev_parse and resolve_ref
we're about to call.

--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [Linux Kernel Development]     [Gcc Help]     [IETF Annouce]     [DCCP]     [Netdev]     [Networking]     [Security]     [V4L]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux SCSI]     [Fedora Users]

  Powered by Linux