Re: [PATCH spice-server] StreamDevice: Handle incomplete reads of StreamMsgFormat

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



> 
> On Wed, 2017-11-01 at 05:02 -0400, Frediano Ziglio wrote:
> > > 
> > > This is currently unlikely to happen since we communicate over a
> > > pipe
> > > and the pipe buffer is sufficiently large to avoid splitting the
> > > message. But for completeness, we should handle this scenario.
> > > 
> > > Signed-off-by: Jonathon Jongsma <jjongsma@xxxxxxxxxx>
> > > ---
> > >  server/stream-device.c | 33 +++++++++++++++++++++++----------
> > >  1 file changed, 23 insertions(+), 10 deletions(-)
> > > 
> > > diff --git a/server/stream-device.c b/server/stream-device.c
> > > index fc5b50659..259527246 100644
> > > --- a/server/stream-device.c
> > > +++ b/server/stream-device.c
> > > @@ -42,6 +42,12 @@ struct StreamDevice {
> > >  
> > >      StreamDevHeader hdr;
> > >      uint8_t hdr_pos;
> > > +    union {
> > > +        StreamMsgFormat format;
> > > +        StreamMsgCapabilities capabilities;
> > > +        uint8_t buf[1024];
> > 
> > why capabilities ?
> 
> Just because it's another potential message (that we're not handling
> yet). I was just preparing for the future when we implement this
> message. I considered adding StreamMsgData to this union as well, but
> thought that perhaps 16*1024 buffer was larger than we wanted within
> the object?
> 
> > why a buffer of 1024 ?
> 
> The 1024 was chosen simply because the StreamMsgCapabilities message
> specified to have a limit of 1024.
> 

Would be great to have a mnemonic in stream-device.h.

> > 
> > > +    } msg;
> > > +    uint8_t msg_pos;
> > 
> > uint8_t is not big enough for the size of msg.
> > 
> > >      bool has_error;
> > >      bool opened;
> > >      bool flow_stopped;
> > > @@ -155,20 +161,27 @@ handle_msg_invalid(StreamDevice *dev,
> > > SpiceCharDeviceInstance *sin, const char *
> > >  static bool
> > >  handle_msg_format(StreamDevice *dev, SpiceCharDeviceInstance *sin)
> > >  {
> > > -    StreamMsgFormat fmt;
> > >      SpiceCharDeviceInterface *sif =
> > > spice_char_device_get_interface(sin);
> > > -    int n = sif->read(sin, (uint8_t *) &fmt, sizeof(fmt));
> > > -    if (n == 0) {
> > > -        return false;
> > > -    }
> > > -    if (n != sizeof(fmt)) {
> > > +
> > > +    spice_assert(dev->hdr_pos >= sizeof(StreamDevHeader));
> > > +    spice_assert(dev->hdr.type == STREAM_TYPE_FORMAT);
> > > +
> > > +    int n = sif->read(sin, dev->msg.buf + dev->msg_pos,
> > > sizeof(StreamMsgFormat) - dev->msg_pos);
> > > +    if (n < 0) {
> > >          return handle_msg_invalid(dev, sin, NULL);
> > >      }
> > > -    fmt.width = GUINT32_FROM_LE(fmt.width);
> > > -    fmt.height = GUINT32_FROM_LE(fmt.height);
> > > -    stream_channel_change_format(dev->stream_channel, &fmt);
> > >  
> > > -    return true;
> > > +    dev->msg_pos += n;
> > > +
> > > +    if (dev->msg_pos >= sizeof(StreamMsgFormat)) {
> > 
> > I would do a "if (dev->msg_pos < sizeof(StreamMsgFormat)) return
> > false" instead.
> > 
> > > +        dev->msg.format.width = GUINT32_FROM_LE(dev-
> > > >msg.format.width);
> > > +        dev->msg.format.height = GUINT32_FROM_LE(dev-
> > > >msg.format.height);
> > > +        stream_channel_change_format(dev->stream_channel, &dev-
> > > >msg.format);
> > > +        dev->msg_pos = 0;
> > 
> > should this reset be in the main code ? I think so.
> > 
> > > +        return true;
> > > +    }
> > > +
> > > +    return false;
> > >  }
> > >  
> > >  static bool
> > 

Frediano
_______________________________________________
Spice-devel mailing list
Spice-devel@xxxxxxxxxxxxxxxxxxxxx
https://lists.freedesktop.org/mailman/listinfo/spice-devel




[Index of Archives]     [Linux ARM Kernel]     [Linux ARM]     [Linux Omap]     [Fedora ARM]     [IETF Annouce]     [Security]     [Bugtraq]     [Linux]     [Linux OMAP]     [Linux MIPS]     [ECOS]     [Asterisk Internet PBX]     [Linux API]     [Monitors]