[Spice-devel] [RFC PATCH spice-streaming-agent 2/2] Implement handling of error messages from the server
Lukáš Hrázký
lhrazky at redhat.com
Mon Feb 26 11:35:20 UTC 2018
On Thu, 2018-02-22 at 19:25 +0100, Christophe de Dinechin wrote:
> > On 22 Feb 2018, at 15:11, Lukáš Hrázký <lhrazky at redhat.com> wrote:
> >
> > Signed-off-by: Lukáš Hrázký <lhrazky at redhat.com>
> > ---
> > src/spice-streaming-agent.cpp | 18 ++++++++++++++++--
> > 1 file changed, 16 insertions(+), 2 deletions(-)
> >
> > diff --git a/src/spice-streaming-agent.cpp b/src/spice-streaming-agent.cpp
> > index b88225f..73baa48 100644
> > --- a/src/spice-streaming-agent.cpp
> > +++ b/src/spice-streaming-agent.cpp
> > @@ -130,8 +130,22 @@ static void handle_stream_capabilities(uint32_t len)
> >
> > static void handle_stream_error(uint32_t len)
> > {
> > - // TODO read message and use it
> > - throw std::runtime_error("got an error message from server");
> > + const size_t MSG_SIZE = 256;
> > +
> > + // TODO the message should have an upper size limit defined somewhere?
> > + if (len >= MSG_SIZE) {
> > + throw std::runtime_error("NotifyError message size " + std::to_string(len) +
> > + " is too long (longer than " + std::to_string(MSG_SIZE) + ")”);
>
> I would try to read the first MSG_SIZE bytes, this may give us a clue as to what the server wanted to tell us.
Good idea. However, I can't think of an elegant way to then read out
the rest of the message from the fd. Because we do not abort on
receiving the error message, so I need to either abort or read the
whole message out.
And since this shouldn't really happen anyway, I'm thinking of just
leave it as-is, unless you can suggest a simple way of reading out the
message?
> > + }
> > +
> > + uint8_t msg[MSG_SIZE];
>
> Why do a low-level byte allocation like this to then cast the pointer? Why not have a StreamMsgNotifyErrorXYZ on the stack (which is the StreamMsgNotify with non-zero space for the message)?
Not following, is StreamMsgNotifyErrorXYZ a real type?
>
> > + msg[len] = '\0'; // make sure to terminate the string - TODO is there a better way?
>
> Put this after the read_message, safer…
Will do.
> > +
> > + read_message(msg, len);
> > + StreamMsgNotifyError *error_msg = (StreamMsgNotifyError*) msg;
>
> Yucky in C++ code, and I believe unnecessary here.
True, reinterpret_cast. Or something better related to the
StreamMsgNotifyErrorXYZ above?
> > +
> > + syslog(LOG_ERR, "Received NotifyError message from the client: %d - %s\n",
> > + error_msg->error_code, error_msg->msg);
>
> Does syslog accept %.*s? If so, that might be safer and cheaper than relying on zero termination.
But with this the length specified is 'static' in the string? Not sure
how I could use it?
Thanks,
Lukas
> > }
> >
> > static void read_command_from_device(void)
> > --
> > 2.16.1
> >
> > _______________________________________________
> > Spice-devel mailing list
> > Spice-devel at lists.freedesktop.org
> > https://lists.freedesktop.org/mailman/listinfo/spice-devel
>
>
More information about the Spice-devel
mailing list