[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH for-4.12 RFC] xen/console: Handle NUL character in buffer sent via CONSOLEIO_write
On Tue, Feb 26, 2019 at 11:03:51PM +0000, Julien Grall wrote: > After upgrading Debian to Buster, I started noticing console mangling > when using zsh. This is happenning because output sent by zsh to the > console may contain NUL character in the middle of the buffer. > > Linux is sending the buffer as it is to Xen console via CONSOLEIO_write. > However, the implementation in Xen considers NUL character is used to > terminate the buffer and therefore will ignore anything after it. > > The actual documentation of CONSOLEIO_write is pretty limited. From the > declaration, the hypercall takes a buffer and size. So this could lead > to think the NUL character is allowed in the middle of the buffer. > > This patch updates the console API to pass the size along the buffer > down so we can remove the reliance on buffer terminating by a NUL > character. > > Signed-off-by: Julien Grall <julien.grall@xxxxxxx> > > --- > [...] > @@ -527,7 +527,7 @@ static inline void xen_console_write_debug_port(const > char *buf, size_t len) > static long guest_console_write(XEN_GUEST_HANDLE_PARAM(char) buffer, int > count) > { > char kbuf[128]; > - int kcount = 0; > + unsigned int kcount = 0; > struct domain *cd = current->domain; > > while ( count > 0 ) > @@ -547,8 +547,8 @@ static long > guest_console_write(XEN_GUEST_HANDLE_PARAM(char) buffer, int count) > /* Use direct console output as it could be interactive */ > spin_lock_irq(&console_lock); > > - sercon_puts(kbuf); > - video_puts(kbuf); > + sercon_puts(kbuf, kcount); > + video_puts(kbuf, kcount); > I think you missed the non-hwdom branch in the same function. It still strips non-printable characters. > int console_suspend(void) [...] > diff --git a/xen/drivers/char/consoled.c b/xen/drivers/char/consoled.c > index 552abf5766..3e849a2557 100644 > --- a/xen/drivers/char/consoled.c > +++ b/xen/drivers/char/consoled.c > @@ -77,7 +77,7 @@ size_t consoled_guest_rx(void) > > if ( idx >= BUF_SZ ) > { > - pv_console_puts(buf); > + pv_console_puts(buf, BUF_SZ); > idx = 0; > } > } > @@ -85,7 +85,7 @@ size_t consoled_guest_rx(void) > if ( idx ) > { > buf[idx] = '\0'; Can this be deleted? Now that you've explicitly sized the buffer. Wei. _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxxx https://lists.xenproject.org/mailman/listinfo/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |