[Spice-devel] [PATCH libcacard 1/2] vscclient: Catch write errors
Jason Andryuk
jandryuk at gmail.com
Thu Aug 9 16:22:59 UTC 2018
On Fri, Jul 27, 2018 at 4:07 AM, Frediano Ziglio <fziglio at redhat.com> wrote:
>>
>> 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.
Sorry for the slow response. I'll have to look at this again. I
think I wanted to avoid terminating the program, so the skipping of
g_error was important for that. But I can't recall, so I'll have to
re-investigate.
Regards,
Jason
More information about the Spice-devel
mailing list