diff --git a/flatpak-proxy.c b/flatpak-proxy.c index 2ea079c..eab7a89 100644 --- a/flatpak-proxy.c +++ b/flatpak-proxy.c @@ -1166,6 +1166,24 @@ header_free (Header *header) g_free (header); } +static const char * +header_debug_str (GString *s, Header *header) +{ + if (header->path) + g_string_append_printf (s, "\n\tPath: %s", header->path); + if (header->interface) + g_string_append_printf (s, "\n\tInterface: %s", header->interface); + if (header->member) + g_string_append_printf (s, "\n\tMember: %s", header->member); + if (header->error_name) + g_string_append_printf (s, "\n\tError name: %s", header->error_name); + if (header->destination) + g_string_append_printf (s, "\n\tDestination: %s", header->destination); + if (header->sender) + g_string_append_printf (s, "\n\tSender: %s", header->sender); + return s->str; +} + static Header * parse_header (Buffer *buffer, guint32 serial_offset, guint32 reply_serial_offset, guint32 hello_serial, GError **error) { @@ -1175,6 +1193,7 @@ parse_header (Buffer *buffer, guint32 serial_offset, guint32 reply_serial_offset guint32 reply_serial_pos = 0; const char *signature; g_autoptr(GError) str_error = NULL; + g_autoptr(GString) header_str = NULL; g_autoptr(Header) header = g_new0 (Header, 1); @@ -1296,10 +1315,13 @@ parse_header (Buffer *buffer, guint32 serial_offset, guint32 reply_serial_offset header->path = get_string (buffer, header, &offset, end_offset, &str_error); if (header->path == NULL) { + header_str = g_string_new (NULL); g_set_error (error, G_IO_ERROR, G_IO_ERROR_INVALID_DATA, - "Could not parse path in path field: %s", str_error->message); + "Could not parse path in path field: %s%s", + str_error->message, + header_debug_str (header_str, header)); return NULL; } break; @@ -1316,10 +1338,13 @@ parse_header (Buffer *buffer, guint32 serial_offset, guint32 reply_serial_offset header->interface = get_string (buffer, header, &offset, end_offset, &str_error); if (header->interface == NULL) { + header_str = g_string_new (NULL); g_set_error (error, G_IO_ERROR, G_IO_ERROR_INVALID_DATA, - "Could not parse interface in interface field: %s", str_error->message); + "Could not parse interface in interface field: %s%s", + str_error->message, + header_debug_str (header_str, header)); return NULL; } break; @@ -1336,10 +1361,13 @@ parse_header (Buffer *buffer, guint32 serial_offset, guint32 reply_serial_offset header->member = get_string (buffer, header, &offset, end_offset, &str_error); if (header->member == NULL) { + header_str = g_string_new (NULL); g_set_error (error, G_IO_ERROR, G_IO_ERROR_INVALID_DATA, - "Could not parse member in member field: %s", str_error->message); + "Could not parse member in member field: %s%s", + str_error->message, + header_debug_str (header_str, header)); return NULL; } break; @@ -1356,10 +1384,13 @@ parse_header (Buffer *buffer, guint32 serial_offset, guint32 reply_serial_offset header->error_name = get_string (buffer, header, &offset, end_offset, &str_error); if (header->error_name == NULL) { + header_str = g_string_new (NULL); g_set_error (error, G_IO_ERROR, G_IO_ERROR_INVALID_DATA, - "Could not parse error in error field: %s", str_error->message); + "Could not parse error in error field: %s%s", + str_error->message, + header_debug_str (header_str, header)); return NULL; } break; @@ -1392,10 +1423,13 @@ parse_header (Buffer *buffer, guint32 serial_offset, guint32 reply_serial_offset header->destination = get_string (buffer, header, &offset, end_offset, &str_error); if (header->destination == NULL) { + header_str = g_string_new (NULL); g_set_error (error, G_IO_ERROR, G_IO_ERROR_INVALID_DATA, - "Could not parse destination in destination field: %s", str_error->message); + "Could not parse destination in destination field: %s%s", + str_error->message, + header_debug_str (header_str, header)); return NULL; } break; @@ -1412,10 +1446,13 @@ parse_header (Buffer *buffer, guint32 serial_offset, guint32 reply_serial_offset header->sender = get_string (buffer, header, &offset, end_offset, &str_error); if (header->sender == NULL) { + header_str = g_string_new (NULL); g_set_error (error, G_IO_ERROR, G_IO_ERROR_INVALID_DATA, - "Could not parse sender in sender field: %s", str_error->message); + "Could not parse sender in sender field: %s%s", + str_error->message, + header_debug_str (header_str, header)); return NULL; } break; @@ -1469,10 +1506,12 @@ parse_header (Buffer *buffer, guint32 serial_offset, guint32 reply_serial_offset case G_DBUS_MESSAGE_TYPE_METHOD_CALL: if (header->path == NULL || header->member == NULL) { + header_str = g_string_new (NULL); g_set_error (error, G_IO_ERROR, G_IO_ERROR_INVALID_DATA, - "Method call is missing path or member"); + "Method call is missing path or member%s", + header_debug_str (header_str, header)); return NULL; } break; @@ -1480,10 +1519,12 @@ parse_header (Buffer *buffer, guint32 serial_offset, guint32 reply_serial_offset case G_DBUS_MESSAGE_TYPE_METHOD_RETURN: if (!header->has_reply_serial) { + header_str = g_string_new (NULL); g_set_error (error, G_IO_ERROR, G_IO_ERROR_INVALID_DATA, - "Method return has no reply serial"); + "Method return has no reply serial%s", + header_debug_str (header_str, header)); return NULL; } break; @@ -1491,10 +1532,12 @@ parse_header (Buffer *buffer, guint32 serial_offset, guint32 reply_serial_offset case G_DBUS_MESSAGE_TYPE_ERROR: if (header->error_name == NULL || !header->has_reply_serial) { + header_str = g_string_new (NULL); g_set_error (error, G_IO_ERROR, G_IO_ERROR_INVALID_DATA, - "Error is missing error name or reply serial"); + "Error is missing error name or reply serial%s", + header_debug_str (header_str, header)); return NULL; } break; @@ -1504,30 +1547,36 @@ parse_header (Buffer *buffer, guint32 serial_offset, guint32 reply_serial_offset header->interface == NULL || header->member == NULL) { + header_str = g_string_new (NULL); g_set_error (error, G_IO_ERROR, G_IO_ERROR_INVALID_DATA, - "Signal is missing path, interface or member"); + "Signal is missing path, interface or member%s", + header_debug_str (header_str, header)); return NULL; } if (strcmp (header->path, "/org/freedesktop/DBus/Local") == 0 || strcmp (header->interface, "org.freedesktop.DBus.Local") == 0) { + header_str = g_string_new (NULL); g_set_error (error, G_IO_ERROR, G_IO_ERROR_INVALID_DATA, - "Signal is to D-Bus Local path or interface (%s, %s)", - header->path, header->interface); + "Signal is to D-Bus Local path or interface%s", + header_debug_str (header_str, header)); return NULL; } break; default: /* Unknown message type, for safety, fail parse */ + header_str = g_string_new (NULL); g_set_error (error, G_IO_ERROR, G_IO_ERROR_INVALID_DATA, - "Unknown message type (%d)", header->type); + "Unknown message type (%d)%s", + header->type, + header_debug_str (header_str, header)); return NULL; }