[PATCH v8 11/11] lib: sbi: Fix missing '\0' when buffer szie equal 1

Anup Patel anup at brainfault.org
Sun Jul 9 08:18:02 PDT 2023


On Sun, Jul 9, 2023 at 11:47 AM Xiang W <wxjstz at 126.com> wrote:
>
> 在 2023-07-09星期日的 11:02 +0530,Anup Patel写道:
> > On Thu, Jul 6, 2023 at 12:20 PM Xiang W <wxjstz at 126.com> wrote:
> > >
> > > 在 2023-07-06星期四的 11:08 +0530,Anup Patel写道:
> > > > On Wed, Jul 5, 2023 at 8:08 PM Xiang W <wxjstz at 126.com> wrote:
> > > > >
> > > > > Fix special case: sbi_snprintf(out, out_len, ...) when out_len equal
> > > > > 1, The previous code will not fill the buffer with any char.
> > > >
> > > > I would rather do something like below in printc(...)
> > > >
> > > > diff --git a/lib/sbi/sbi_console.c b/lib/sbi/sbi_console.c
> > > > index 168dffd..e0ecb41 100644
> > > > --- a/lib/sbi/sbi_console.c
> > > > +++ b/lib/sbi/sbi_console.c
> > > > @@ -138,10 +138,10 @@ static void printc(char **out, u32 *out_len, char ch)
> > > >       * The *printf entry point functions have enforced that (*out) can
> > > >       * only be null when out_len is non-null and its value is zero.
> > > >       */
> > > > -    if (!out_len || *out_len > 1) {
> > > > +    if (!out_len || *out_len)
> > > >          *(*out)++ = ch;
> > > > +    if (!out_len || *out_len > 1)
> > > >          **out = '\0';
> > > > -    }
> > >
> > > When *out_len is equal to 1, that is, when there is not enough buffer to drop
> > > the formatted string, a string without '\0' will be generated.
> > >
> > > And when there is a problem with the format in sbi_snprintf, it may not entry
> > > printc at all. e.g:
> > >         sbi_printf(out,out_len,"%f",3.14)
> >
> > Fair enough but I still think check on out_len is also required.
> >
> > if (out && out_len && *out_len)
> >     **out = '\0';
>
> If we check out_len, it will result in possible loss of '\0' in the following cases:
>         sbi_sprintf(out, format, ...)

In which case, we should do something like below:

if (out) {
    if (!out_len || *out_len)
        **out = '\0';
}

Regards,
Anup

>
> Regards,
> Xiang W
> >
> > Regards,
> > Anup
> >
> > >
> > > Regards,
> > > Xiang W
> > >
> > > >
> > > >      if (out_len && *out_len > 0)
> > > >          --(*out_len);
> > > >
> > > > Regards,
> > > > Anup
> > > >
> > > > >
> > > > > Signed-off-by: Xiang W <wxjstz at 126.com>
> > > > > ---
> > > > >  lib/sbi/sbi_console.c | 4 ++++
> > > > >  1 file changed, 4 insertions(+)
> > > > >
> > > > > diff --git a/lib/sbi/sbi_console.c b/lib/sbi/sbi_console.c
> > > > > index 00feec8..0703d4a 100644
> > > > > --- a/lib/sbi/sbi_console.c
> > > > > +++ b/lib/sbi/sbi_console.c
> > > > > @@ -271,6 +271,10 @@ static int print(char **out, u32 *out_len, const char *format, va_list args)
> > > > >                 out_len = &console_tbuf_len;
> > > > >         }
> > > > >
> > > > > +       /* handle special case: *out_len == 1*/
> > > > > +       if (out)
> > > > > +               **out = '\0';
> > > > > +
> > > > >         for (; *format != 0; ++format) {
> > > > >                 width = flags = 0;
> > > > >                 if (use_tbuf)
> > > > > --
> > > > > 2.40.1
> > > > >
> > >
>



More information about the opensbi mailing list