Skip to content

Commit

Permalink
flatpak-proxy: Print parsed header info when parsing fails
Browse files Browse the repository at this point in the history
Print the parts of the header that got successfully parsed when parsing
fails.
  • Loading branch information
hadess committed Jul 20, 2023
1 parent 3e572b4 commit 26877e6
Showing 1 changed file with 62 additions and 13 deletions.
75 changes: 62 additions & 13 deletions flatpak-proxy.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)
{
Expand All @@ -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);

Expand Down Expand Up @@ -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;
Expand All @@ -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;
Expand All @@ -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;
Expand All @@ -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;
Expand Down Expand Up @@ -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;
Expand All @@ -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;
Expand Down Expand Up @@ -1469,32 +1506,38 @@ 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;

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;

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;
Expand All @@ -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;
}

Expand Down

0 comments on commit 26877e6

Please sign in to comment.