[PATCH v2] lib: sbi: Fix sbi_snprintf

Xiang W wxjstz at 126.com
Wed Jul 27 06:56:17 PDT 2022


在 2022-07-27星期三的 15:45 +0200,Andrew Jones写道:
> On Wed, Jul 27, 2022 at 09:27:52PM +0800, Xiang W wrote:
> > 在 2022-07-27星期三的 14:12 +0200,Andrew Jones写道:
> > > printc would happily write to 'out' even when 'out_len' was zero,
> > > potentially overflowing buffers. Rework printc to not do that and
> > > also ensure the null byte is written at the last position when
> > > necessary, as stated in the snprintf man page. Also, panic if
> > > sprintf or snprintf are called with NULL output strings (except
> > > the special case of snprintf having a NULL output string and
> > > a zero output size, allowing it to be used to get the number of
> > > characters that would have been written). Finally, rename a
> > > goto label which clashed with 'out'.
> > > 
> > > Fixes: 9e8ff05cb61f ("Initial commit.")
> > > Signed-off-by: Andrew Jones <ajones at ventanamicro.com>
> > > ---
> > > 
> > > v2:
> > >   - Simply forbid *out == NULL by panicing when it's detected.
> > >     (The error message for snprintf has been split over two
> > >      lines to avoid going over 80 chars. I'd prefer error messages
> > >      not be split, but that seems like the general practice for
> > >      opensbi.)
> > >   - Drop some branches, particularly the extra 'if (out)' in print(),
> > >     by always writing a '\0' on each printc [Xiang W]
> > > 
> > > 
> > >  lib/sbi/sbi_console.c | 35 +++++++++++++++++++----------------
> > >  1 file changed, 19 insertions(+), 16 deletions(-)
> > > 
> > > diff --git a/lib/sbi/sbi_console.c b/lib/sbi/sbi_console.c
> > > index 34c843d3f9e3..e300d710b5c8 100644
> > > --- a/lib/sbi/sbi_console.c
> > > +++ b/lib/sbi/sbi_console.c
> > > @@ -76,20 +76,18 @@ typedef __builtin_va_list va_list;
> > >  
> > >  static void printc(char **out, u32 *out_len, char ch)
> > >  {
> > > -       if (out) {
> > > -               if (*out) {
> > > -                       if (out_len && (0 < *out_len)) {
> > > -                               **out = ch;
> > > -                               ++(*out);
> > > -                               (*out_len)--;
> > > -                       } else {
> > > -                               **out = ch;
> > > -                               ++(*out);
> > > -                       }
> > > -               }
> > > -       } else {
> > > +       if (!out) {
> > >                 sbi_putc(ch);
> > > +               return;
> > >         }
> > > +
> > > +       if (!out_len || *out_len > 1) {
> > > +               *(*out)++ = ch;
> > Before this, it was not determined that *out was not NULL.
> > 
> > Argument checking before calling the function is not a substitute
> > for checking the function itself, the function should do what it
> > has to do. Otherwise, others need more understanding work during
> > secondary development.
> 
> I disagree. Argument checking in private helper functions is overly
> defensive programming. Indeed, helper functions should expect the
> entry points of its module to do the argument checking. It is
> reasonable to add a comment pointing out that we know *out can't be
> NULL here, though, as printc is the only place we do the dereferencing.

Yes, I agree to add a comment to clarify

Regards,
Xiang W
> 
> Thanks,
> drew





More information about the opensbi mailing list