[Spice-devel] [PATCH spice-server v2] stream-device: Create channels before first non-main channel connection

Jonathon Jongsma jjongsma at redhat.com
Tue Feb 27 17:30:44 UTC 2018


On Tue, 2018-02-27 at 10:59 +0000, Frediano Ziglio wrote:
> Due to ticket expiration, is possible that the streaming channels for

"it is possible"

> the
> client are created after the ticket expires, this as currently 

end sentence after "expires". Then:

"Currently, streaming channels are..."


> streaming
> channels are created dynamically when the guest starts streaming to
> the
> server which can happen at any time (for instance if you decide to 

add comma: "server, which can"...

> start
> the graphic server manually).
> This causes the client to not be able to connect to a new streaming
> channel as the authentication would fail.

Perhaps rephrase the previous sentence as:

"If the ticket has expired before the streaming channel is created,
authentication will fail and the client will not be able to connect."

> To avoid this, create the channels when the first main channel
> connection
> is made. This make sure that client will connect to all streaming 

"make" -> "makes"

or better: "This ensures that"...

> channels.
> This can be considered a temporary solution, connecting back to the
> VM is
> helpful in different situations however this requires some protocol
> changes
> and different security considerations.

I find this sentence a little bit unclear. Suggestion:

"This could be considered a temporary solution. There may be other
situations where it would be useful to connect new channels after the
ticket has expired, but enabling this behavior would require protocol
changes and a careful analysis of security implications.


> 
> Signed-off-by: Frediano Ziglio <fziglio at redhat.com>
> ---
>  server/char-device.h   |  1 +
>  server/reds-private.h  |  1 +
>  server/reds.c          | 20 ++++++++++++++++++++
>  server/stream-device.c | 11 +++++++++++
>  4 files changed, 33 insertions(+)
> 
> Changes since v1:
> - improve commit message.
> 
> diff --git a/server/char-device.h b/server/char-device.h
> index 54a1ef93..a9634383 100644
> --- a/server/char-device.h
> +++ b/server/char-device.h
> @@ -237,6 +237,7 @@ RedCharDevice *spicevmc_device_connect(RedsState
> *reds,
>  void spicevmc_device_disconnect(RedsState *reds,
>                                  SpiceCharDeviceInstance
> *char_device);
>  RedCharDevice *stream_device_connect(RedsState *reds,
> SpiceCharDeviceInstance *sin);
> +void stream_device_create_channel(RedCharDevice *dev);
>  
>  SpiceCharDeviceInterface
> *spice_char_device_get_interface(SpiceCharDeviceInstance *instance);
>  
> diff --git a/server/reds-private.h b/server/reds-private.h
> index adc48ba5..920edc5c 100644
> --- a/server/reds-private.h
> +++ b/server/reds-private.h
> @@ -117,6 +117,7 @@ struct RedsState {
>      RedStatFile *stat_file;
>  #endif
>      int allow_multiple_clients;
> +    bool late_initialization_done;
>  
>      /* Intermediate state for on going monitors config message from
> a single
>       * client, being passed to the guest */
> diff --git a/server/reds.c b/server/reds.c
> index a31ed4e9..30243f47 100644
> --- a/server/reds.c
> +++ b/server/reds.c
> @@ -1733,6 +1733,24 @@ static RedClient *reds_get_client(RedsState
> *reds)
>      return reds->clients->data;
>  }
>  
> +/* Performs late initializations steps.
> + * This should be called when a client connects */

C3D suggested additional comments here, which I basically agree with,
although they could be placed within the body of the function below...


> +static void reds_late_initialization(RedsState *reds)
> +{
> +    RedCharDevice *dev;
> +
> +    // do only once
> +    if (reds->late_initialization_done) {
> +        return;
> +    }
> +
> +    // create stream channels for streaming devices

here

> +    GLIST_FOREACH(reds->char_devices, RedCharDevice, dev) {
> +        stream_device_create_channel(dev);
> +    }
> +    reds->late_initialization_done = true;
> +}
> +
>  static void
>  red_channel_capabilities_init_from_link_message(RedChannelCapabiliti
> es *caps,
>                                                  const SpiceLinkMess
> *link_mess)
> @@ -1768,6 +1786,8 @@ static void reds_handle_main_link(RedsState
> *reds, RedLinkInfo *link)
>      spice_debug("trace");
>      spice_assert(reds->main_channel);
>  
> +    reds_late_initialization(reds);
> +
>      link_mess = link->link_mess;
>      if (!reds->allow_multiple_clients) {
>          reds_disconnect(reds);
> diff --git a/server/stream-device.c b/server/stream-device.c
> index b206b116..9298d16e 100644
> --- a/server/stream-device.c
> +++ b/server/stream-device.c
> @@ -32,6 +32,8 @@
>      (G_TYPE_CHECK_INSTANCE_CAST((obj), TYPE_STREAM_DEVICE,
> StreamDevice))
>  #define STREAM_DEVICE_CLASS(klass) \
>      (G_TYPE_CHECK_CLASS_CAST((klass), TYPE_STREAM_DEVICE,
> StreamDeviceClass))
> +#define IS_STREAM_DEVICE(obj) \
> +    (G_TYPE_CHECK_INSTANCE_TYPE((obj), TYPE_STREAM_DEVICE))
>  #define STREAM_DEVICE_GET_CLASS(obj) \
>      (G_TYPE_INSTANCE_GET_CLASS((obj), TYPE_STREAM_DEVICE,
> StreamDeviceClass))
>  
> @@ -70,6 +72,7 @@ static StreamDevice
> *stream_device_new(SpiceCharDeviceInstance *sin, RedsState *
>  G_DEFINE_TYPE(StreamDevice, stream_device, RED_TYPE_CHAR_DEVICE)
>  
>  static void char_device_set_state(RedCharDevice *char_dev, int
> state);
> +static void allocate_channels(StreamDevice *dev);
>  
>  typedef bool StreamMsgHandler(StreamDevice *dev,
> SpiceCharDeviceInstance *sin)
>      SPICE_GNUC_WARN_UNUSED_RESULT;
> @@ -520,6 +523,14 @@ stream_device_connect(RedsState *reds,
> SpiceCharDeviceInstance *sin)
>      return RED_CHAR_DEVICE(dev);
>  }
>  
> +void
> +stream_device_create_channel(RedCharDevice *char_dev)
> +{
> +    if (IS_STREAM_DEVICE(char_dev)) {
> +        allocate_channels(STREAM_DEVICE(char_dev));
> +    }
> +}
> +
>  static void
>  stream_device_dispose(GObject *object)
>  {


Reviewed-by: Jonathon Jongsma <jjongsma at redhat.com>


More information about the Spice-devel mailing list