[Spice-devel] [PATCH libcacard 1/2] vscclient: Catch write errors

Frediano Ziglio fziglio at redhat.com
Fri Jul 27 08:07:57 UTC 2018


> 
> On Wed, Jul 25, 2018 at 5:53 AM, Frediano Ziglio <fziglio at redhat.com> wrote:
> >>
> >> The GIOStatus return value indicates errors, so catch it and check it to
> >> know if we should return an error.
> >>
> >> Signed-off-by: Jason Andryuk <jandryuk at gmail.com>
> >> ---
> >> Truth be told, I can't remember exactly why I had to write this.  Could
> >> status be G_IO_STATUS_ERROR, but err still be NULL?  Since I added
> >> debugging output with those value, it maybe the case.
> >>
> >
> > Looking at GLib source code there are different paths leading to
> > status == G_IO_STATUS_ERROR and err == NULL.
> > For instance trying to mix read and write and encoding.
> > Or for some parameter checks.
> >
> >>  src/vscclient.c | 11 ++++++++++-
> >>  1 file changed, 10 insertions(+), 1 deletion(-)
> >>
> >> diff --git a/src/vscclient.c b/src/vscclient.c
> >> index fa60162..56e2ced 100644
> >> --- a/src/vscclient.c
> >> +++ b/src/vscclient.c
> >> @@ -69,12 +69,21 @@ do_socket_send(GIOChannel *source,
> >>  {
> >>      gsize bw;
> >>      GError *err = NULL;
> >> +    GIOStatus status;
> >>
> >>      g_return_val_if_fail(socket_to_send->len != 0, FALSE);
> >>      g_return_val_if_fail(condition & G_IO_OUT, FALSE);
> >>
> >> -    g_io_channel_write_chars(channel_socket,
> >> +    status = g_io_channel_write_chars(channel_socket,
> >>          (gchar *)socket_to_send->data, socket_to_send->len, &bw, &err);
> >> +    if (verbose) {
> >> +        printf("status: %d bytes written: %d err: %p\n", status, bw,
> >> err);
> >
> > This looks like more a debug thing than a verbose one (don't know
> > much about libcacard).
> 
> vscclient doesn't have a debug option, but it does have some verbose >
> 10 checks for debug-like messages.  I can bump it up to that.
> 

Looking better libcacard is using GLib, maybe a g_debug would be better.

> >> +    }
> >> +
> >> +    if (status == G_IO_STATUS_ERROR) {
> >
> > No logs?
> 
> I can add one.  Also, I'm testing out re-ordering this test after the
> err != NULL check.  In either case we'll abort from the function, but
> if err is set, then we can print a more informative message.
> 

Make sense.

> >> +        return FALSE;
> >> +    }
> >> +
> >>      if (err != NULL) {
> >>          g_error("Error while sending socket %s", err->message);

So any error here with a message is terminating the program.

> >>          return FALSE;

And this is never executed.

> >
> > Frediano
> 
> Thanks for the review.
> 
> Jason
> 


More information about the Spice-devel mailing list