On Tue, Mar 21, 2017 at 11:14:23AM -0700, Junio C Hamano wrote:

> Jeff King <p...@peff.net> writes:
> 
> > diff --git a/worktree.c b/worktree.c
> > index 42dd3d52b..2520fc65c 100644
> > --- a/worktree.c
> > +++ b/worktree.c
> > @@ -250,16 +250,19 @@ struct worktree *find_worktree(struct worktree **list,
> >  {
> >     struct worktree *wt;
> >     char *path;
> > +   char *to_free;
> >  
> >     if ((wt = find_worktree_by_suffix(list, arg)))
> >             return wt;
> >  
> > -   arg = prefix_filename(prefix, arg);
> > +   if (prefix)
> > +           arg = to_free = prefix_filename(prefix, arg);
> >     path = real_pathdup(arg, 1);
> >     for (; *list; list++)
> >             if (!fspathcmp(path, real_path((*list)->path)))
> >                     break;
> >     free(path);
> > +   free(to_free);
> >     return *list;
> >  }
> 
> worktree.c:265:6: error: to_free may be used uninitialized in this function

Doh. I had originally written it without the "if (prefix)" and added it
as a micro-optimization at the end.

Still, the whole thing compiles fine for me. I find it odd that neither
gcc nor clang notices the problem on my system. It's quite obviously
wrong.

> diff --git a/worktree.c b/worktree.c
> index 2520fc65cc..bae787cf8d 100644
> --- a/worktree.c
> +++ b/worktree.c
> @@ -250,7 +250,7 @@ struct worktree *find_worktree(struct worktree **list,
>  {
>       struct worktree *wt;
>       char *path;
> -     char *to_free;
> +     char *to_free = NULL;

Yep, this is the right fix. Thanks.

-Peff

Reply via email to