dbus_bool_t
_dbus_header_load_gvariant (DBusHeader *header,
- DBusTypeReader *reader,
DBusValidity *validity)
{
size_t fields_offsets[DBUS_HEADER_FIELD_LAST];
int *pos);
dbus_bool_t _dbus_header_load_gvariant (DBusHeader *header,
- DBusTypeReader *reader,
DBusValidity *validity);
dbus_bool_t _dbus_gvariant_raw_get_lengths (const DBusString *str,
}
if (reader.gvariant)
{
- if (!_dbus_header_load_gvariant (header, &reader, validity))
+ if (!_dbus_header_load_gvariant (header, validity))
goto invalid;
}
else
type_str_p,
type_pos_p,
&type_str_len);
- if (got_signature)
+ if (got_signature && type_str_len > 1)
{
message->signature = dbus_new (DBusString, 1);
got_signature = got_signature &&
- _dbus_string_init_preallocated (message->signature, type_str_len + 1);
+ _dbus_string_init_preallocated (message->signature, type_str_len - 1);
+ /* we need to copy the signature, but to ensure backward compatibility
+ * it must be stripped off outer parentheses - they are always there */
got_signature = got_signature &&
- _dbus_string_copy_len (*type_str_p, *type_pos_p, type_str_len,
+ _dbus_string_copy_len (*type_str_p, *type_pos_p + 1, type_str_len - 2,
message->signature, 0);
got_signature = got_signature &&
_dbus_string_append_byte (message->signature, 0);
if (!gvariant)
_dbus_header_update_lengths (&ret->header,
_dbus_string_get_length (&ret->body));
- /* For GVariant: */
+ /* For GVariant: */
/* Field: SIGNATURE to body; add body offset - this is done with dbus_message_lock() */
+ else
+ dbus_message_lock (ret);
return ret;
static int
kdbus_decode_dbus_message (const struct kdbus_msg *msg,
- char *data,
+ char *data,
DBusTransportKdbus *kdbus_transport,
int *fds,
int *n_fds)
ret_size = kdbus_decode_msg (msg, data, kdbus_transport, fds, n_fds);
if (ret_size == -1) /* error */
- {
- _dbus_string_set_length (buffer, start);
- return -1;
- }
- else if (buf_size != ret_size) /* case of locally generated message */
- {
- _dbus_string_set_length (buffer, start + ret_size);
- }
+ _dbus_string_set_length (buffer, start);
+ else if (ret_size >= 0 && buf_size != ret_size) /* case of locally generated message */
+ _dbus_string_set_length (buffer, start + ret_size);
- _dbus_message_loader_set_unique_sender_id (kdbus_transport->base.loader, msg->src_id);
+ if (ret_size >= 0)
+ _dbus_message_loader_set_unique_sender_id (kdbus_transport->base.loader, msg->src_id);
if (kdbus_transport->activator != NULL)
return ret_size;