[PATCH 1/2] discover/syslinux-parser: clean up boot option list entries

Samuel Mendoza-Jonas sam at mendozajonas.com
Wed Apr 18 11:08:53 AEST 2018


On Wed, 2018-04-18 at 08:50 +1000, Brett Grandbois wrote:
> 
> On 17/04/18 15:11, Samuel Mendoza-Jonas wrote:
> > On Thu, 2018-04-12 at 16:12 +1000, Brett Grandbois wrote:
> > > in finalize loop or we can get duplicate boot entries as well as
> > > the memory leak
> > > 
> > > Signed-off-by: Brett Grandbois <brett.grandbois at opengear.com>
> > > ---
> > >   discover/syslinux-parser.c | 10 +++++++---
> > >   1 file changed, 7 insertions(+), 3 deletions(-)
> > > 
> > > diff --git a/discover/syslinux-parser.c b/discover/syslinux-parser.c
> > > index d948765..8f5bfeb 100644
> > > --- a/discover/syslinux-parser.c
> > > +++ b/discover/syslinux-parser.c
> > > @@ -310,20 +310,21 @@ static void syslinux_finalize(struct conf_context *conf)
> > >   		implicit_image = false;
> > >   
> > >   	list_for_each_entry(&state->processed_options, syslinux_opt, list) {
> > > +		list_remove(&syslinux_opt->list);
> > 
> > Should be list_for_each_entry_safe() now.
> 
> Yep that's fine.  This is an overall policy?  Should all the calls be 
> list_for_each_entry be updated while I'm there?

Only if we're modifying the list while walking it but that looks like the
only case in syslinux-parser.

> > 
> > >   		/* need a valid image */
> > >   		if (!syslinux_opt->image)
> > > -			continue;
> > > +			goto next;
> > >   
> > >   		image = syslinux_opt->image;
> > >   		label = syslinux_opt->label;
> > >   
> > >   		/* if implicit is disabled we must have a label */
> > >   		if (!label && !implicit_image)
> > > -			continue;
> > > +			goto next;
> > >   
> > >   		d_opt = discover_boot_option_create(dc, dc->device);
> > >   		if (!d_opt)
> > > -			continue;
> > > +			goto next;
> > >   		if (!d_opt->option)
> > >   			goto fail;
> > >   
> > > @@ -403,8 +404,11 @@ static void syslinux_finalize(struct conf_context *conf)
> > >   		conf_strip_str(opt->description);
> > >   
> > >   		discover_context_add_boot_option(dc, d_opt);
> > > +next:
> > > +		talloc_free(syslinux_opt);
> > >   		continue;
> > >   fail:
> > > +		talloc_free(syslinux_opt);
> > >   		talloc_free(d_opt);
> > >   	}
> > 
> > I wonder if it might be simpler to after the loop do
> > 
> > 	list_for_each_entry_safe(&state->processed_options, syslinux_opt, list)
> > 		talloc_free(syslinux_opt);
> > 	list_init(&state->processed_options);
> > 
> > Then we just need talloc_free(d_opt) at the end of the first loop and we're
> > sure the list is empty before returning to syslinux_parse(). What do you think?
> 
> It's still the same logic, the difference being whether you walk through 
> the list once or twice.  The only real complexity you're saving is the 
> goto next which I admit I'm not thrilled about but is consistent with 
> the goto fail case flow.  Hmm, it does make the intent a lot more 
> explicit rather than spreading it across the top and bottom though.  Yep 
> I don't see any issues changing it.

Sounds like the same thought process I was going through :)

> > 
> > >   }
> 
> _______________________________________________
> Petitboot mailing list
> Petitboot at lists.ozlabs.org
> https://lists.ozlabs.org/listinfo/petitboot



More information about the Petitboot mailing list