Re: [PATCH 09/11] bisect: check strbuf_getline_lf return when reading terms

Johannes Schindelin <[email protected]> Wed, 5 Aug 2026 16:33:20 +0200 (CEST)
Newsgroups org.kernel.vger.git
Message-ID <[email protected]>
Hi Junio,

On Sun, 19 Jul 2026, Junio C Hamano wrote:

> Junio C Hamano <[email protected]> writes:
> 
> > "Johannes Schindelin via GitGitGadget" <[email protected]>
> > writes:
> > ...
> >> diff --git a/builtin/bisect.c b/builtin/bisect.c
> >> index 798e28f501..fe66d84382 100644
> >> --- a/builtin/bisect.c
> >> +++ b/builtin/bisect.c
> >> @@ -498,9 +498,15 @@ static int get_terms(struct bisect_terms *terms)
> >>  	}
> >>  
> >>  	free_terms(terms);
> >> -	strbuf_getline_lf(&str, fp);
> >> +	if (strbuf_getline_lf(&str, fp) == EOF) {
> >> +		res = -1;
> >> +		goto finish;
> >> +	}
> >>  	terms->term_bad = strbuf_detach(&str, NULL);
> >> -	strbuf_getline_lf(&str, fp);
> >> +	if (strbuf_getline_lf(&str, fp) == EOF) {
> >> +		res = -1;
> >> +		goto finish;
> >> +	}
> >
> > We want to clean-up terms->term_bad when we fail to read the second
> > line after reading the first line successfully, no?
> >
> >>  	terms->term_good = strbuf_detach(&str, NULL);
> >>  
> >>  finish:
> 
> --- >8 ---
> Subject: [PATCH] fixup! bisect: check strbuf_getline_lf return when reading
>  terms
> 
> https://lore.kernel.org/git/[email protected]/
> 
> This fixes the immediate leak introduced by
> 
> https://lore.kernel.org/git/17c382fdf46eada79ce03a7604dd7e0454d8bea4.1784069325.git.gitgitgadget@gmail.com/
> 
> but many callers of get_terms() should all be fixed to check for
> return value.  If it fails to grab the replacement word for "bad",
> both terms->term_bad and terms->term_good are left NULL, since the
> function calls free_terms() early.
> 
> diff --git a/builtin/bisect.c b/builtin/bisect.c
> index fe66d84382..69ab7ea248 100644
> --- a/builtin/bisect.c
> +++ b/builtin/bisect.c
> @@ -505,6 +505,7 @@ static int get_terms(struct bisect_terms *terms)
>  	terms->term_bad = strbuf_detach(&str, NULL);
>  	if (strbuf_getline_lf(&str, fp) == EOF) {
>  		res = -1;
> +		FREE_AND_NULL(terms->term_bad);

Good catch!

Thank you,
Johannes

>  		goto finish;
>  	}
>  	terms->term_good = strbuf_detach(&str, NULL);
>