summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWill Thompson <will.thompson@collabora.co.uk>2009-06-07 17:44:26 +0100
committerWill Thompson <will.thompson@collabora.co.uk>2009-06-07 18:58:24 +0100
commit6337116e42d564a3fb469ce7e9ef64e7534ab708 (patch)
tree6954443801a4c73eb314ce416f3083ef15e3d149
parentc1f165261afcc3bafa9b24ff916bb231628e3782 (diff)
Ensure messages are locked while marshalling.fill-in-length-before-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>).
-rw-r--r--dbus/dbus-message.c15
1 files changed, 15 insertions, 0 deletions
diff --git a/dbus/dbus-message.c b/dbus/dbus-message.c
index edae4258..83b1ebb2 100644
--- a/dbus/dbus-message.c
+++ b/dbus/dbus-message.c
@@ -3941,6 +3941,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);
@@ -3949,6 +3950,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;
@@ -3963,10 +3970,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;
}