git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: [PATCH 1/2] remote.c: don't leak the base branch name in format_tracking_info

From
Jeff King <peff@peff.net>
Date
Aug 10, 2014, 19:32 UTC
Message-ID
<20140810193242.GA9886@peff.net>
In-Reply-To
<53E78C59.2010704@gmail.com>
On Sun, Aug 10, 2014 at 05:14:33PM +0200, Stefan Beller wrote:
Show 35 quoted lines
> 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
Previous: Stefan BellerNext: Stefan Beller
Message 4 of 6 in “remote.c: don't leak the base branch name in format_tracking_info”
  1. 1/2 remote.c: don't leak the base branch name in format_tracking_infoStefan Beller, Aug 10, 2014
  2. 2/2 clone.c: don't leak memory in cmd_cloneStefan Beller, Aug 10, 2014
  3. Stefan BellerAug 10, 2014
  4. Jeff KingAug 10, 2014
  5. remote.c: don't leak the base branch name in format_tracking_infoStefan Beller, Aug 10, 2014
  6. Junio C HamanoAug 10, 2014

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.