AW: [PATCH] spl: fix error handling of spl_fit_read

mailinglist1 at johanneskirchmair.de mailinglist1 at johanneskirchmair.de
Mon Aug 19 08:45:58 CEST 2024


Hey,

> -----Ursprüngliche Nachricht-----
> Von: Simon Glass <sjg at chromium.org>
> Gesendet: Samstag, 17. August 2024 17:58
> An: mailinglist1 at johanneskirchmair.de; Sean Anderson
> <seanga2 at gmail.com>
> Cc: u-boot at lists.denx.de; trini at konsulko.com; Johannes Kirchmair
> <johannes.kirchmair at skidata.com>
> Betreff: Re: [PATCH] spl: fix error handling of spl_fit_read
> 
> +Sean Anderson too, for this
> 
> Hi,
> 
> On Fri, 16 Aug 2024 at 07:36, <mailinglist1 at johanneskirchmair.de> wrote:
> >
> > From: Johannes Kirchmair <johannes.kirchmair at skidata.com>
> >
> > Returning negative values from spl_fit_read leads to u-boot crashing.
> > The return value of spl_fit_read is compared with an unsigned value.
> > Returning negative values leads to the check not detecting the error.
> > Not detecting the error leads to crashing.
> >
> > Returning zero in case of an reading error is fine. It indicates that
> > nothing was red.
> 
> read
> 
> >
> > Signed-off-by: Johannes Kirchmair <johannes.kirchmair at skidata.com>
> > ---
> >  common/spl/spl_fat.c | 2 +-
> >  include/spl_load.h   | 4 ++--
> >  2 files changed, 3 insertions(+), 3 deletions(-)
> >
> 
> Perhaps instead this should be fixed in _spl_load()? We don't want to ignore
> errors, and returning -EIO is not as good as returning the actual error received.
> The docs of struct spl_load_info indicate that functions should return 0 on
> error, but that is somewhat surprising behaviour, which is probably why
> people are not following it?
Could also be a valid way of fixing, as Sean did in his patch [1]
Too have less confusion in the future, we should also switch the signature from returning ulong to long and allow negative return values for errors.

> 
> > diff --git a/common/spl/spl_fat.c b/common/spl/spl_fat.c index
> > bd8aab253a..345bc55149 100644
> > --- a/common/spl/spl_fat.c
> > +++ b/common/spl/spl_fat.c
> > @@ -53,7 +53,7 @@ static ulong spl_fit_read(struct spl_load_info
> > *load, ulong file_offset,
> >
> >         ret = fat_read_file(filename, buf, file_offset, size, &actread);
> >         if (ret)
> > -               return ret;
> > +               return 0;
> >
> >         return actread;
> >  }
> > diff --git a/include/spl_load.h b/include/spl_load.h index
> > 1c2b296c0a..b411d9daa1 100644
> > --- a/include/spl_load.h
> > +++ b/include/spl_load.h
> > @@ -17,8 +17,8 @@ static inline int _spl_load(struct spl_image_info
> > *spl_image,  {
> >         struct legacy_img_hdr *header =
> >                 spl_get_load_buffer(-sizeof(*header), sizeof(*header));
> > -       ulong base_offset, image_offset, overhead;
> > -       int read, ret;
> > +       ulong base_offset, image_offset, overhead, read;
> > +       int ret;
> >
> >         read = info->read(info, offset, ALIGN(sizeof(*header),
> >                                               spl_get_bl_len(info)),
> > header);
> > --
> > 2.34.1
> >
> 
> Regards,
> Simon

Best regards,
Johannes

[1] https://lore.kernel.org/u-boot/20240731130913.487121-1-fventuri@comcast.net/



More information about the U-Boot mailing list