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

Jason Andryuk jandryuk at gmail.com
Thu Jul 26 18:33:48 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.

>> +    }
>> +
>> +    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.

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

Thanks for the review.

Jason


More information about the Spice-devel mailing list