git.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Jeff King <peff@peff.net>
To: Stefan Beller <stefanbeller@gmail.com>
Cc: git@vger.kernel.org, gitster@pobox.com
Subject: Re: [PATCH 1/2] remote.c: don't leak the base branch name in format_tracking_info
Date: Sun, 10 Aug 2014 15:32:42 -0400	[thread overview]
Message-ID: <20140810193242.GA9886@peff.net> (raw)
In-Reply-To: <53E78C59.2010704@gmail.com>

On Sun, Aug 10, 2014 at 05:14:33PM +0200, Stefan Beller wrote:

> On 10.08.2014 15:57, Stefan Beller wrote:
> > Found by scan.coverity.com (Id: 1127809)
> > 
> > Signed-off-by: Stefan Beller <stefanbeller@gmail.com>
> > ---
> >  remote.c | 1 +
> >  1 file changed, 1 insertion(+)
> > 
> > diff --git a/remote.c b/remote.c
> > index 3d6c86a..2c1458f 100644
> > --- a/remote.c
> > +++ b/remote.c
> > @@ -1983,6 +1983,7 @@ int format_tracking_info(struct branch *branch, struct strbuf *sb)
> >  			strbuf_addf(sb,
> >  				_("  (use \"git pull\" to merge the remote branch into yours)\n"));
> >  	}
> > +	free(base);
> >  	return 1;
> >  }
> >  
> > 
> 
> Upon testing this one again, I get a warning
> remote.c: In function ‘format_tracking_info’:
> remote.c:1986:2: warning: passing argument 1 of ‘free’ discards ‘const’ qualifier from pointer target type [enabled by default]
>   free(base);
>   ^
> In file included from git-compat-util.h:103:0,
>                  from cache.h:4,
>                  from remote.c:1:
> /usr/include/stdlib.h:483:13: note: expected ‘void *’ but argument is of type ‘const char *’
>  extern void free (void *__ptr) __THROW;
>              ^
> 
> Please ignore this patch.

I think your patch is definitely fixing a leak; it's just that the
existing code is a little sloppy. It does:

  const char *base;
  ...
  base = branch->merge[0]->dst;
  base = shorten_unambiguous_ref(base, 0);

In the first assignment, "base" should be const, as we are pointing to
somebody else's memory. But in the second, we use the same pointer to
store newly allocated memory from shorten_unambiguous_ref.

In the general case, you need two pointers to do this right. However, we
don't actually look at "base" between the two assignments, so I think
you could just do it as:

  char *base;
  ...
  base = shorten_unambiguous_ref(branch->merge[0]->dst, 0);

-Peff

  reply	other threads:[~2014-08-10 19:32 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-08-10 13:57 [PATCH 1/2] remote.c: don't leak the base branch name in format_tracking_info Stefan Beller
2014-08-10 13:57 ` [PATCH 2/2] clone.c: don't leak memory in cmd_clone Stefan Beller
2014-08-10 15:14 ` [PATCH 1/2] remote.c: don't leak the base branch name in format_tracking_info Stefan Beller
2014-08-10 19:32   ` Jeff King [this message]
2014-08-10 19:43     ` [PATCH] " Stefan Beller
2014-08-10 23:03   ` [PATCH 1/2] " Junio C Hamano

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20140810193242.GA9886@peff.net \
    --to=peff@peff.net \
    --cc=git@vger.kernel.org \
    --cc=gitster@pobox.com \
    --cc=stefanbeller@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).