diff mbox

chardev: don't forget to set backend for mux

Message ID 20171103131959.73560-1-kirill.shutemov@linux.intel.com (mailing list archive)
State New, archived
Headers show

Commit Message

Kirill A . Shutemov Nov. 3, 2017, 1:19 p.m. UTC
I noticied that on recent versions on QEMU I was not able to trigger
SysRq to invoke debug capabilites of Linux Kernel.

I've tracked it down to qemu_chr_be_event() ignoring CHR_EVENT_BREAK due
s->be being NULL.

Looks like the bug was introduced in a4afa548fc6d ("char: move front end
handlers in CharBackend"). Since the commit the qemu_chr_be_event()
failed to deliver CHR_EVENT_BREAK due to qemu_chr_fe_init() forgot to
get s->be initialized in case of mux.

Let's fix this.

Signed-off-by: Kirill A. Shutemov <kirill.shutemov@linux.intel.com>
Fixes: a4afa548fc6d ("char: move front end handlers in CharBackend")
---
 chardev/char-fe.c | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

Comments

Marc-André Lureau Nov. 3, 2017, 2:05 p.m. UTC | #1
Hi

On Fri, Nov 3, 2017 at 2:19 PM, Kirill A. Shutemov
<kirill.shutemov@linux.intel.com> wrote:
> I noticied that on recent versions on QEMU I was not able to trigger
> SysRq to invoke debug capabilites of Linux Kernel.
>
> I've tracked it down to qemu_chr_be_event() ignoring CHR_EVENT_BREAK due
> s->be being NULL.
>
> Looks like the bug was introduced in a4afa548fc6d ("char: move front end
> handlers in CharBackend"). Since the commit the qemu_chr_be_event()
> failed to deliver CHR_EVENT_BREAK due to qemu_chr_fe_init() forgot to
> get s->be initialized in case of mux.
>
> Let's fix this.
>
> Signed-off-by: Kirill A. Shutemov <kirill.shutemov@linux.intel.com>
> Fixes: a4afa548fc6d ("char: move front end handlers in CharBackend")
> ---
>  chardev/char-fe.c | 3 +--
>  1 file changed, 1 insertion(+), 2 deletions(-)
>
> diff --git a/chardev/char-fe.c b/chardev/char-fe.c
> index ee6d59610031..d4a54947a567 100644
> --- a/chardev/char-fe.c
> +++ b/chardev/char-fe.c
> @@ -209,9 +209,8 @@ bool qemu_chr_fe_init(CharBackend *b, Chardev *s, Error **errp)
>          tag = d->mux_cnt++;
>      } else if (s->be) {
>          goto unavailable;
> -    } else {
> -        s->be = b;
>      }
> +    s->be = b;

This will send the event to the last frontend that called
chr_fe_init(). Instead, it should probably send it to the one with
focus. I am sending an alternative patch.

thanks

>
>      b->fe_open = false;
>      b->tag = tag;
> --
> 2.14.2
>
>
diff mbox

Patch

diff --git a/chardev/char-fe.c b/chardev/char-fe.c
index ee6d59610031..d4a54947a567 100644
--- a/chardev/char-fe.c
+++ b/chardev/char-fe.c
@@ -209,9 +209,8 @@  bool qemu_chr_fe_init(CharBackend *b, Chardev *s, Error **errp)
         tag = d->mux_cnt++;
     } else if (s->be) {
         goto unavailable;
-    } else {
-        s->be = b;
     }
+    s->be = b;
 
     b->fe_open = false;
     b->tag = tag;