[PATCH v4] lib: sbi: fix missing '\r' for console

Xiang W wxjstz at 126.com
Mon Feb 27 17:34:33 PST 2023


在 2023-02-28星期二的 09:22 +0800,Bin Meng写道:
> On Mon, Feb 13, 2023 at 5:11 PM Xiang W <wxjstz at 126.com> wrote:
> > 
> > print is finally implemented by sbi_putc or console_dev->puts. sbi_putc
> > will add a \r before the output \n. This patch adds missing \r when
> > outputting characters via console_dev->puts.
> > 
> > Signed-off-by: Xiang W <wxjstz at 126.com>
> > 
> > Changes since v4:
> > - nputs_all come back
> > - implement partial writes as much as possible
> 
> These change logs should go below ---
Thanks for pointing that out. New patch at
https://lists.infradead.org/pipermail/opensbi/2023-February/004601.html

Regards,
Xiang W
> 
> > 
> > Changes since v3:
> > - Prevent string overflow when looking for \n
> > 
> > Changes since v2:
> > - Fix the bug reported by Samuel. Prevent p from accessing memory other
> >   than strings.
> > 
> > ---
> >  lib/sbi/sbi_console.c | 31 ++++++++++++++++++++++++++++++-
> >  1 file changed, 30 insertions(+), 1 deletion(-)
> > 
> > diff --git a/lib/sbi/sbi_console.c b/lib/sbi/sbi_console.c
> > index f3ac003..4be5a8f 100644
> > --- a/lib/sbi/sbi_console.c
> > +++ b/lib/sbi/sbi_console.c
> > @@ -46,12 +46,41 @@ void sbi_putc(char ch)
> >         }
> >  }
> > 
> > +static unsigned long console_puts_all(const char *str, unsigned long len)
> > +{
> > +       const char *s = str;
> > +       const char *e = s + len;
> > +       while (s < e)
> > +               s += console_dev->console_puts(s, e - s);
> > +       return len;
> > +}
> > +
> > +static unsigned long console_puts(const char *str, unsigned long len)
> > +{
> > +       unsigned long l;
> > +       const char *s, *p, *e;
> > +       s = str;
> > +       e = str + len;
> > +       while (s < e) {
> > +               p = sbi_strchr(s, '\n');
> > +               if (p == NULL || p > e)
> > +                       p = e;
> > +               l = console_dev->console_puts(s, p - s);
> > +               if (l < p - s)
> > +                       return s - str + l;
> > +               if (p < e && *p == '\n')
> > +                       console_puts_all("\r\n", 2);
> > +               s = p + 1;
> > +       }
> > +       return len;
> > +}
> > +
> >  static unsigned long nputs(const char *str, unsigned long len)
> >  {
> >         unsigned long i, ret;
> > 
> >         if (console_dev && console_dev->console_puts) {
> > -               ret = console_dev->console_puts(str, len);
> > +               ret = console_puts(str, len);
> >         } else {
> >                 for (i = 0; i < len; i++)
> >                         sbi_putc(str[i]);
> > --
> 
> Regards,
> Bin
> 



More information about the opensbi mailing list