From 75ec6476fd5b5cf22af0b0156e76873bb0f9f7b1 Mon Sep 17 00:00:00 2001 From: Robert Ancell Date: Thu, 4 Sep 2014 17:09:02 +1200 Subject: [PATCH] Make socket writing code used between greeter and daemon more robust --- liblightdm-gobject/greeter.c | 30 ++++++++++++++++++++++-------- src/greeter.c | 24 +++++++++++++++++++++--- 2 files changed, 43 insertions(+), 11 deletions(-) diff --git a/liblightdm-gobject/greeter.c b/liblightdm-gobject/greeter.c index 13fdada9..c2d2c693 100644 --- a/liblightdm-gobject/greeter.c +++ b/liblightdm-gobject/greeter.c @@ -314,7 +314,8 @@ static gboolean send_message (LightDMGreeter *greeter, guint8 *message, gsize message_length) { LightDMGreeterPrivate *priv = GET_PRIVATE (greeter); - GIOStatus status; + gchar *data; + gsize data_length; GError *error = NULL; guint32 stated_length; @@ -333,15 +334,28 @@ send_message (LightDMGreeter *greeter, guint8 *message, gsize message_length) return FALSE; } - status = g_io_channel_write_chars (priv->to_server_channel, (gchar *) message, message_length, NULL, &error); - if (error) - g_warning ("Error writing to daemon: %s", error->message); - g_clear_error (&error); - if (status != G_IO_STATUS_NORMAL) - return FALSE; + data = (gchar *) message; + data_length = message_length; + while (data_length > 0) + { + GIOStatus status; + gsize n_written; + + status = g_io_channel_write_chars (priv->to_server_channel, data, data_length, &n_written, &error); + if (error) + g_warning ("Error writing to daemon: %s", error->message); + g_clear_error (&error); + if (status != G_IO_STATUS_NORMAL) + return FALSE; + data_length -= n_written; + data += n_written; + } g_debug ("Wrote %zi bytes to daemon", message_length); - g_io_channel_flush (priv->to_server_channel, NULL); + g_io_channel_flush (priv->to_server_channel, &error); + if (error) + g_warning ("Failed to flush data to daemon: %s", error->message); + g_clear_error (&error); return TRUE; } diff --git a/src/greeter.c b/src/greeter.c index 9e8829df..bfc77094 100644 --- a/src/greeter.c +++ b/src/greeter.c @@ -183,13 +183,31 @@ int_length (void) static void write_message (Greeter *greeter, guint8 *message, gsize message_length) { + gchar *data; + gsize data_length; GError *error = NULL; - g_io_channel_write_chars (greeter->priv->to_greeter_channel, (gchar *) message, message_length, NULL, &error); + data = (gchar *) message; + data_length = message_length; + while (data_length > 0) + { + GIOStatus status; + gsize n_written; + + status = g_io_channel_write_chars (greeter->priv->to_greeter_channel, data, data_length, &n_written, &error); + if (error) + l_warning (greeter, "Error writing to greeter: %s", error->message); + g_clear_error (&error); + if (status != G_IO_STATUS_NORMAL) + return; + data_length -= n_written; + data += n_written; + } + + g_io_channel_flush (greeter->priv->to_greeter_channel, &error); if (error) - l_warning (greeter, "Error writing to greeter: %s", error->message); + l_warning (greeter, "Failed to flush data to greeter: %s", error->message); g_clear_error (&error); - g_io_channel_flush (greeter->priv->to_greeter_channel, NULL); } static void -- 2.39.2