X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=dbus%2Fdbus-message.c;h=272592e8367bfa723bcd37540bdb07ad34797ac5;hb=3171383ce9bac0c2718da4ce288db890d5d7bfda;hp=30b5d6c0b436bf23843f1e49b6f7a4e3a540b539;hpb=2ff4bc2513db5a0c64297fbf4c5a8486c737a12a;p=platform%2Fupstream%2Fdbus.git diff --git a/dbus/dbus-message.c b/dbus/dbus-message.c index 30b5d6c..272592e 100644 --- a/dbus/dbus-message.c +++ b/dbus/dbus-message.c @@ -18,7 +18,7 @@ * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * */ @@ -1567,8 +1567,10 @@ dbus_message_append_args_valist (DBusMessage *message, if (!dbus_message_iter_append_fixed_array (&array, element_type, value, - n_elements)) + n_elements)) { + dbus_message_iter_abandon_container (&iter, &array); goto failed; + } } else if (element_type == DBUS_TYPE_STRING || element_type == DBUS_TYPE_SIGNATURE || @@ -1589,8 +1591,10 @@ dbus_message_append_args_valist (DBusMessage *message, { if (!dbus_message_iter_append_basic (&array, element_type, - &value[i])) + &value[i])) { + dbus_message_iter_abandon_container (&iter, &array); goto failed; + } ++i; } } @@ -3781,6 +3785,21 @@ _dbus_message_loader_get_is_corrupted (DBusMessageLoader *loader) } /** + * Checks what kind of bad data confused the loader. + * + * @param loader the loader + * @returns why the loader is hosed, or DBUS_VALID if it isn't. + */ +DBusValidity +_dbus_message_loader_get_corruption_reason (DBusMessageLoader *loader) +{ + _dbus_assert ((loader->corrupted && loader->corruption_reason != DBUS_VALID) || + (!loader->corrupted && loader->corruption_reason == DBUS_VALID)); + + return loader->corruption_reason; +} + +/** * Sets the maximum size message we allow. * * @param loader the loader @@ -3996,6 +4015,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); @@ -4004,6 +4024,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; @@ -4018,10 +4044,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; } @@ -4072,7 +4106,8 @@ dbus_message_demarshal (const char *str, return msg; fail_corrupt: - dbus_set_error (error, DBUS_ERROR_INVALID_ARGS, "Message is corrupted"); + dbus_set_error (error, DBUS_ERROR_INVALID_ARGS, "Message is corrupted (%s)", + _dbus_validity_to_error_message (loader->corruption_reason)); _dbus_message_loader_unref (loader); return NULL;