[Spice-devel] [PATCH spice 1/2] reds: Do not crash when setting agent property
Pavel Grunt
pgrunt at redhat.com
Wed Sep 7 09:28:58 UTC 2016
Hi,
On Wed, 2016-09-07 at 05:10 -0400, Frediano Ziglio wrote:
> >
> > Agent properties like file transfer or copy & paste can be
> > disabled by
> > calling spice_server_set_agent_{copypaste, file_xfer} before the
> > spice
> > server is initialized. In that case the call crashes the server
> > because
> > the agent device is created after the initialization.
> >
> > To avoid the crash this commit introduce a helper function for
> > setting
> > the agent properties after the server is initialized.
> > ---
> > server/reds.c | 19 +++++++++++++++----
> > 1 file changed, 15 insertions(+), 4 deletions(-)
> >
> > diff --git a/server/reds.c b/server/reds.c
> > index 74f7727..90d04c8 100644
> > --- a/server/reds.c
> > +++ b/server/reds.c
> > @@ -730,6 +730,18 @@ static void reds_update_mouse_mode(RedsState
> > *reds)
> > }
> > }
> >
> > +static void reds_update_agent_properties(RedsState *reds)
> > +{
> > + if (reds->agent_dev == NULL || reds->config == NULL)
> > + return;
>
>
> Brackets
>
> > + /* copy & paste */
> > + reds->agent_dev->priv->write_filter.copy_paste_enabled =
> > reds->config->agent_copypaste;
> > + reds->agent_dev->priv->read_filter.copy_paste_enabled =
> > reds->config->agent_copypaste;
> > + /* file transfer */
> > + reds->agent_dev->priv->write_filter.file_xfer_enabled =
> > reds->config->agent_file_xfer;
> > + reds->agent_dev->priv->read_filter.file_xfer_enabled =
> > reds->config->agent_file_xfer;
> > +}
> > +
> > static void reds_agent_remove(RedsState *reds)
> > {
> > // TODO: agent is broken with multiple clients. also need to
> > figure out
> > what to do when
> > @@ -3438,6 +3450,7 @@ static int do_spice_init(RedsState *reds,
> > SpiceCoreInterface *core_interface)
> > reds->listen_socket = -1;
> > reds->secure_listen_socket = -1;
> > reds->agent_dev = red_char_device_vdi_port_new(reds);
> > + reds_update_agent_properties(reds);
> > ring_init(&reds->clients);
> > reds->num_clients = 0;
> > reds->main_dispatcher = main_dispatcher_new(reds, reds-
> > >core);
> > @@ -4030,16 +4043,14 @@ SPICE_GNUC_VISIBLE int
> > spice_server_set_agent_mouse(SpiceServer *reds, int enabl
> > SPICE_GNUC_VISIBLE int
> > spice_server_set_agent_copypaste(SpiceServer *reds,
> > int enable)
> > {
> > reds->config->agent_copypaste = enable;
> > - reds->agent_dev->priv->write_filter.copy_paste_enabled =
> > reds->config->agent_copypaste;
> > - reds->agent_dev->priv->read_filter.copy_paste_enabled =
> > reds->config->agent_copypaste;
> > + reds_update_agent_properties(reds);
> > return 0;
> > }
> >
> > SPICE_GNUC_VISIBLE int
> > spice_server_set_agent_file_xfer(SpiceServer *reds,
> > int enable)
> > {
> > reds->config->agent_file_xfer = enable;
> > - reds->agent_dev->priv->write_filter.file_xfer_enabled =
> > reds->config->agent_file_xfer;
> > - reds->agent_dev->priv->read_filter.file_xfer_enabled =
> > reds->config->agent_file_xfer;
> > + reds_update_agent_properties(reds);
> > return 0;
> > }
> >
>
>
> Looks like read and write filters can be set independently so this
> patch seems to change a bit behavior but as you said if these
> functions
> are meant to be called only during initialization they are fine.
Qemu uses them only during before init, but it is not documented when
they should be called. I would say anytime. In the past/stable it
worked anytime, now it works only after init.
>
> Is this another regression caused by some Agent change?
It is, but I didn't look for the commit.
>
> Beside the style,
>
> Acked-by: Frediano Ziglio <fziglio at redhat.com>
>
> Frediano
>
More information about the Spice-devel
mailing list