Ensure messages are locked while marshalling.

Locking a message has the side-effect of updating the message's length
header. Previously, if dbus_message_marshal() was called on an unlocked
message, it could yield an invalid message (as discovered by Ben
Schwartz in <http://bugs.freedesktop.org/show_bug.cgi?id=19723>).
(cherry picked from commit 9f825271f9)
This commit is contained in:
Will Thompson 2009-06-07 17:44:26 +01:00 committed by Colin Walters
parent f412447c95
commit 1c4e856396

View file

@ -4000,6 +4000,7 @@ dbus_message_marshal (DBusMessage *msg,
int *len_p)
{
DBusString tmp;
dbus_bool_t was_locked;
_dbus_return_val_if_fail (msg != NULL, FALSE);
_dbus_return_val_if_fail (marshalled_data_p != NULL, FALSE);
@ -4008,6 +4009,12 @@ dbus_message_marshal (DBusMessage *msg,
if (!_dbus_string_init (&tmp))
return FALSE;
/* Ensure the message is locked, to ensure the length header is filled in. */
was_locked = msg->locked;
if (!was_locked)
dbus_message_lock (msg);
if (!_dbus_string_copy (&(msg->header.data), 0, &tmp, 0))
goto fail;
@ -4022,10 +4029,18 @@ dbus_message_marshal (DBusMessage *msg,
goto fail;
_dbus_string_free (&tmp);
if (!was_locked)
msg->locked = FALSE;
return TRUE;
fail:
_dbus_string_free (&tmp);
if (!was_locked)
msg->locked = FALSE;
return FALSE;
}