]> git.ipfire.org Git - thirdparty/dbus.git/commitdiff
_dbus_message_remove_unknown_fields: Add
authorSimon McVittie <smcv@collabora.com>
Tue, 12 Dec 2017 14:04:04 +0000 (14:04 +0000)
committerSimon McVittie <smcv@collabora.com>
Thu, 11 Jan 2018 18:34:39 +0000 (18:34 +0000)
Bug: https://bugs.freedesktop.org/show_bug.cgi?id=100317
Reviewed-by: Philip Withnall <withnall@endlessm.com>
Signed-off-by: Simon McVittie <smcv@collabora.com>
dbus/dbus-marshal-header.c
dbus/dbus-marshal-header.h
dbus/dbus-message-internal.h
dbus/dbus-message.c

index a3d73f8937c747d6ffbba06a9bb6c4e948f4151a..f9a3325838399e40b07d1e76bc1d34f8b1e3db46 100644 (file)
@@ -1514,4 +1514,55 @@ _dbus_header_byteswap (DBusHeader *header,
   _dbus_string_set_byte (&header->data, BYTE_ORDER_OFFSET, new_order);
 }
 
+/**
+ * Remove every header field not known to this version of dbus.
+ *
+ * @param header the header
+ * @returns #FALSE if no memory
+ */
+dbus_bool_t
+_dbus_header_remove_unknown_fields (DBusHeader *header)
+{
+  DBusTypeReader array;
+  DBusTypeReader fields_reader;
+
+  _dbus_type_reader_init (&fields_reader,
+                          _dbus_header_get_byte_order (header),
+                          &_dbus_header_signature_str,
+                          FIELDS_ARRAY_SIGNATURE_OFFSET,
+                          &header->data,
+                          FIELDS_ARRAY_LENGTH_OFFSET);
+
+  _dbus_type_reader_recurse (&fields_reader, &array);
+
+  while (_dbus_type_reader_get_current_type (&array) != DBUS_TYPE_INVALID)
+    {
+      DBusTypeReader sub;
+      unsigned char field_code;
+
+      _dbus_type_reader_recurse (&array, &sub);
+
+      _dbus_assert (_dbus_type_reader_get_current_type (&sub) == DBUS_TYPE_BYTE);
+      _dbus_type_reader_read_basic (&sub, &field_code);
+
+      if (field_code > DBUS_HEADER_FIELD_LAST)
+        {
+          if (!reserve_header_padding (header))
+            return FALSE;
+
+          if (!_dbus_type_reader_delete (&array, &fields_reader))
+            return FALSE;
+
+          correct_header_padding (header);
+          _dbus_header_cache_invalidate_all (header);
+        }
+      else
+        {
+          _dbus_type_reader_next (&array);
+        }
+    }
+
+  return TRUE;
+}
+
 /** @} */
index 85547efd3b4889464ee1eb57cdba9c1539036fce..b838e0394f36e68d560f93c1b3fd3127e3a0ea7f 100644 (file)
@@ -172,7 +172,6 @@ void          _dbus_header_byteswap               (DBusHeader        *header,
                                                    int                new_order);
 DBUS_PRIVATE_EXPORT
 char          _dbus_header_get_byte_order         (const DBusHeader  *header);
-
-
+dbus_bool_t   _dbus_header_remove_unknown_fields  (DBusHeader        *header);
 
 #endif /* DBUS_MARSHAL_HEADER_H */
index 38c79236514a028272774d01ce430304c1cf9522..3dcd56213270a3aad009e60a8500fee11d91cd23 100644 (file)
@@ -64,6 +64,8 @@ void        _dbus_message_add_counter_link      (DBusMessage  *message,
                                                  DBusList     *link);
 void        _dbus_message_remove_counter        (DBusMessage  *message,
                                                  DBusCounter  *counter);
+DBUS_PRIVATE_EXPORT
+dbus_bool_t _dbus_message_remove_unknown_fields (DBusMessage  *message);
 
 DBUS_PRIVATE_EXPORT
 DBusMessageLoader* _dbus_message_loader_new                   (void);
index 66a397478cf9bbab7c1d3c28b58607cb626335ab..36066848098d3edad39d47ac1b1bbce9d57de238 100644 (file)
@@ -262,6 +262,18 @@ void _dbus_message_get_unix_fds(DBusMessage *message,
 #endif
 }
 
+/**
+ * Remove every header field not known to this version of dbus.
+ *
+ * @param message the message
+ * @returns #FALSE if no memory
+ */
+dbus_bool_t
+_dbus_message_remove_unknown_fields (DBusMessage *message)
+{
+  return _dbus_header_remove_unknown_fields (&message->header);
+}
+
 /**
  * Sets the serial number of a message.
  * This can only be done once on a message.