|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [XEN][PATCH] console/consoleio: account for xen serial input focus during write
On 09.01.2026 23:35, Stefano Stabellini wrote:
> I independently wrote this patch which also supports console reads.
> Sorry about the mixed messages.
>
> ---
>
>
> xen/console: handle multiple domains using console_io hypercalls
>
> Allow multiple dom0less domains to use the console_io hypercalls to
> print to the console. Handle them in a similar way to vpl011: only the
> domain which has focus can read from the console. All domains can write
> to the console but the ones without focus have a prefix. In this case
> the prefix is applied by using guest_printk instead of printk or
> console_puts which is what the original code was already doing.
>
> Signed-off-by: Stefano Stabellini <stefano.stabellini@xxxxxxx>
> ---
> xen/drivers/char/console.c | 22 +++++++++++++++++++++-
> 1 file changed, 21 insertions(+), 1 deletion(-)
>
> diff --git a/xen/drivers/char/console.c b/xen/drivers/char/console.c
> index dcc31170f2..826bee3848 100644
> --- a/xen/drivers/char/console.c
> +++ b/xen/drivers/char/console.c
> @@ -729,6 +729,7 @@ static long
> guest_console_write(XEN_GUEST_HANDLE_PARAM(char) buffer,
> unsigned int flags = opt_console_to_ring
> ? CONSOLE_ALL : CONSOLE_DEFAULT;
> struct domain *cd = current->domain;
> + struct domain *input;
>
> while ( count > 0 )
> {
> @@ -741,17 +742,26 @@ static long
> guest_console_write(XEN_GUEST_HANDLE_PARAM(char) buffer,
> if ( copy_from_guest(kbuf, buffer, kcount) )
> return -EFAULT;
>
> - if ( is_hardware_domain(cd) )
> + input = console_get_domain();
> + if (input && cd == input)
Nit: Style (losing blanks).
> {
> + if ( cd->pbuf_idx )
> + {
> + cd->pbuf[cd->pbuf_idx] = '\0';
> + console_send(cd->pbuf, cd->pbuf_idx + 1, flags);
> + cd->pbuf_idx = 0;
> + }
What is pbuf_idx? I can't find any such field in present staging. With that it
is also unclear what is actually being done here.
In any event I don't think you want to print/send the trailing nul char that
you insert. With that (and with console_send() taking the length anyway) it's
further unclear why the nul needs inserting in the first place (and thus, as
it looks, risking a buffer overrun).
> @@ -793,6 +803,7 @@ long do_console_io(
> {
> long rc;
> unsigned int idx, len;
> + struct domain *d;
>
> rc = xsm_console_io(XSM_OTHER, current->domain, cmd);
> if ( rc )
> @@ -813,6 +824,13 @@ long do_console_io(
> if ( count > INT_MAX )
> break;
>
> + d = console_get_domain();
> + if ( d != current->domain )
> + {
> + console_put_domain(d);
> + return 0;
> + }
> +
> rc = 0;
> while ( (serial_rx_cons != serial_rx_prod) && (rc < count) )
> {
> @@ -824,12 +842,14 @@ long do_console_io(
> len = count - rc;
> if ( copy_to_guest_offset(buffer, rc, &serial_rx_ring[idx], len)
> )
> {
> + console_put_domain(d);
> rc = -EFAULT;
> break;
> }
> rc += len;
> serial_rx_cons += len;
> }
> + console_put_domain(d);
> break;
> default:
> rc = -ENOSYS;
Hmm, this looks insufficient to me. Unconsumed input at the point focus switches
should not blindly go to the next domain. It was intended for what was the focus
at the time of typing.
Jan
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |