summaryrefslogtreecommitdiff
path: root/dbus/dbus-message.c
diff options
context:
space:
mode:
Diffstat (limited to 'dbus/dbus-message.c')
-rw-r--r--dbus/dbus-message.c525
1 files changed, 226 insertions, 299 deletions
diff --git a/dbus/dbus-message.c b/dbus/dbus-message.c
index d62cbf4f..2ed421d7 100644
--- a/dbus/dbus-message.c
+++ b/dbus/dbus-message.c
@@ -42,36 +42,6 @@
* @{
*/
-enum
-{
- FIELD_HEADER_LENGTH,
- FIELD_BODY_LENGTH,
- FIELD_CLIENT_SERIAL,
- FIELD_PATH,
- FIELD_INTERFACE,
- FIELD_MEMBER,
- FIELD_ERROR_NAME,
- FIELD_SERVICE,
- FIELD_SENDER_SERVICE,
- FIELD_REPLY_SERIAL,
-
- FIELD_LAST
-};
-
-static dbus_bool_t field_is_named[FIELD_LAST] =
-{
- FALSE, /* FIELD_HEADER_LENGTH */
- FALSE, /* FIELD_BODY_LENGTH */
- FALSE, /* FIELD_CLIENT_SERIAL */
- TRUE, /* FIELD_PATH */
- TRUE, /* FIELD_INTERFACE */
- TRUE, /* FIELD_MEMBER */
- TRUE, /* FIELD_ERROR_NAME */
- TRUE, /* FIELD_SERVICE */
- TRUE, /* FIELD_SENDER_SERVICE */
- TRUE /* FIELD_REPLY_SERIAL */
-};
-
/**
* Cached information about a header field in the message
*/
@@ -83,13 +53,20 @@ typedef struct
} HeaderField;
/** Offset to byte order from start of header */
-#define BYTE_ORDER_OFFSET 0
+#define BYTE_ORDER_OFFSET 0
/** Offset to type from start of header */
-#define TYPE_OFFSET 1
+#define TYPE_OFFSET 1
/** Offset to flags from start of header */
-#define FLAGS_OFFSET 2
+#define FLAGS_OFFSET 2
/** Offset to version from start of header */
-#define VERSION_OFFSET 3
+#define VERSION_OFFSET 3
+/** Offset to header length from start of header */
+#define HEADER_LENGTH_OFFSET 4
+/** Offset to body length from start of header */
+#define BODY_LENGTH_OFFSET 8
+/** Offset to client serial from start of header */
+#define CLIENT_SERIAL_OFFSET 12
+
/**
* @brief Internals of DBusMessage
@@ -107,9 +84,9 @@ struct DBusMessage
* independently realloc it.
*/
- HeaderField header_fields[FIELD_LAST]; /**< Track the location
- * of each field in "header"
- */
+ HeaderField header_fields[DBUS_HEADER_FIELD_LAST + 1]; /**< Track the location
+ * of each field in "header"
+ */
dbus_uint32_t client_serial; /**< Cached client serial value for speed */
dbus_uint32_t reply_serial; /**< Cached reply serial value for speed */
@@ -217,7 +194,7 @@ adjust_field_offsets (DBusMessage *message,
return;
i = 0;
- while (i < FIELD_LAST)
+ while (i <= DBUS_HEADER_FIELD_LAST)
{
if (message->header_fields[i].offset > offsets_after)
message->header_fields[i].offset += delta;
@@ -234,7 +211,7 @@ get_int_field (DBusMessage *message,
{
int offset;
- _dbus_assert (field < FIELD_LAST);
+ _dbus_assert (field <= DBUS_HEADER_FIELD_LAST);
offset = message->header_fields[field].offset;
@@ -254,7 +231,7 @@ get_uint_field (DBusMessage *message,
{
int offset;
- _dbus_assert (field < FIELD_LAST);
+ _dbus_assert (field <= DBUS_HEADER_FIELD_LAST);
offset = message->header_fields[field].offset;
@@ -277,7 +254,7 @@ get_string_field (DBusMessage *message,
offset = message->header_fields[field].offset;
- _dbus_assert (field < FIELD_LAST);
+ _dbus_assert (field <= DBUS_HEADER_FIELD_LAST);
if (offset < 0)
return NULL;
@@ -308,7 +285,7 @@ get_path_field_decomposed (DBusMessage *message,
offset = message->header_fields[field].offset;
- _dbus_assert (field < FIELD_LAST);
+ _dbus_assert (field <= DBUS_HEADER_FIELD_LAST);
if (offset < 0)
{
@@ -327,7 +304,6 @@ get_path_field_decomposed (DBusMessage *message,
static dbus_bool_t
append_int_field (DBusMessage *message,
int field,
- const char *name,
int value)
{
int orig_len;
@@ -341,7 +317,7 @@ append_int_field (DBusMessage *message,
if (!_dbus_string_align_length (&message->header, 4))
goto failed;
- if (!_dbus_string_append_len (&message->header, name, 4))
+ if (!_dbus_string_append_byte (&message->header, field))
goto failed;
if (!_dbus_string_append_byte (&message->header, DBUS_TYPE_INT32))
@@ -378,8 +354,7 @@ append_int_field (DBusMessage *message,
static dbus_bool_t
append_uint_field (DBusMessage *message,
int field,
- const char *name,
- int value)
+ int value)
{
int orig_len;
@@ -392,7 +367,7 @@ append_uint_field (DBusMessage *message,
if (!_dbus_string_align_length (&message->header, 4))
goto failed;
- if (!_dbus_string_append_len (&message->header, name, 4))
+ if (!_dbus_string_append_byte (&message->header, field))
goto failed;
if (!_dbus_string_append_byte (&message->header, DBUS_TYPE_UINT32))
@@ -429,7 +404,6 @@ static dbus_bool_t
append_string_field (DBusMessage *message,
int field,
int type,
- const char *name,
const char *value)
{
int orig_len;
@@ -443,7 +417,7 @@ append_string_field (DBusMessage *message,
if (!_dbus_string_align_length (&message->header, 4))
goto failed;
- if (!_dbus_string_append_len (&message->header, name, 4))
+ if (!_dbus_string_append_byte (&message->header, field))
goto failed;
if (!_dbus_string_append_byte (&message->header, type))
@@ -488,23 +462,22 @@ delete_int_or_uint_field (DBusMessage *message,
int offset = message->header_fields[field].offset;
_dbus_assert (!message->locked);
- _dbus_assert (field_is_named[field]);
if (offset < 0)
return;
clear_header_padding (message);
- /* The field typecode and name take up 8 bytes */
+ /* The field typecode and name take up 4 bytes */
_dbus_string_delete (&message->header,
- offset - 8,
- 12);
+ offset - 4,
+ 8);
message->header_fields[field].offset = -1;
adjust_field_offsets (message,
- offset - 8,
- - 12);
+ offset - 4,
+ - 8);
append_header_padding (message);
}
@@ -519,7 +492,6 @@ delete_string_field (DBusMessage *message,
int delete_len;
_dbus_assert (!message->locked);
- _dbus_assert (field_is_named[field]);
if (offset < 0)
return;
@@ -528,19 +500,19 @@ delete_string_field (DBusMessage *message,
get_string_field (message, field, &len);
- /* The field typecode and name take up 8 bytes, and the nul
+ /* The field typecode and name take up 4 bytes, and the nul
* termination is 1 bytes, string length integer is 4 bytes
*/
- delete_len = 8 + 4 + 1 + len;
+ delete_len = 4 + 4 + 1 + len;
_dbus_string_delete (&message->header,
- offset - 8,
+ offset - 4,
delete_len);
message->header_fields[field].offset = -1;
adjust_field_offsets (message,
- offset - 8,
+ offset - 4,
- delete_len);
append_header_padding (message);
@@ -593,10 +565,9 @@ set_uint_field (DBusMessage *message,
switch (field)
{
- case FIELD_REPLY_SERIAL:
- return append_uint_field (message, field,
- DBUS_HEADER_FIELD_REPLY,
- value);
+ case DBUS_HEADER_FIELD_REPLY_SERIAL:
+ return append_uint_field (message, field, value);
+
default:
_dbus_assert_not_reached ("appending a uint field we don't support appending");
return FALSE;
@@ -629,30 +600,14 @@ set_string_field (DBusMessage *message,
switch (field)
{
- case FIELD_PATH:
- return append_string_field (message, field, type,
- DBUS_HEADER_FIELD_PATH,
- value);
- case FIELD_SENDER_SERVICE:
- return append_string_field (message, field, type,
- DBUS_HEADER_FIELD_SENDER_SERVICE,
- value);
- case FIELD_INTERFACE:
- return append_string_field (message, field, type,
- DBUS_HEADER_FIELD_INTERFACE,
- value);
- case FIELD_MEMBER:
- return append_string_field (message, field, type,
- DBUS_HEADER_FIELD_MEMBER,
- value);
- case FIELD_ERROR_NAME:
- return append_string_field (message, field, type,
- DBUS_HEADER_FIELD_ERROR_NAME,
- value);
- case FIELD_SERVICE:
- return append_string_field (message, field, type,
- DBUS_HEADER_FIELD_SERVICE,
- value);
+ case DBUS_HEADER_FIELD_PATH:
+ case DBUS_HEADER_FIELD_SENDER_SERVICE:
+ case DBUS_HEADER_FIELD_INTERFACE:
+ case DBUS_HEADER_FIELD_MEMBER:
+ case DBUS_HEADER_FIELD_ERROR_NAME:
+ case DBUS_HEADER_FIELD_SERVICE:
+ return append_string_field (message, field, type, value);
+
default:
_dbus_assert_not_reached ("appending a string field we don't support appending");
return FALSE;
@@ -714,9 +669,12 @@ _dbus_message_set_serial (DBusMessage *message,
{
_dbus_assert (!message->locked);
_dbus_assert (dbus_message_get_serial (message) == 0);
-
- set_uint_field (message, FIELD_CLIENT_SERIAL,
- serial);
+
+ _dbus_marshal_set_uint32 (&message->header,
+ message->byte_order,
+ CLIENT_SERIAL_OFFSET,
+ serial);
+
message->client_serial = serial;
}
@@ -734,7 +692,8 @@ dbus_message_set_reply_serial (DBusMessage *message,
{
_dbus_assert (!message->locked);
- if (set_uint_field (message, FIELD_REPLY_SERIAL,
+ if (set_uint_field (message,
+ DBUS_HEADER_FIELD_REPLY_SERIAL,
reply_serial))
{
message->reply_serial = reply_serial;
@@ -894,15 +853,12 @@ dbus_message_create_header (DBusMessage *message,
if (!_dbus_string_append_byte (&message->header, DBUS_MAJOR_PROTOCOL_VERSION))
return FALSE;
- message->header_fields[FIELD_HEADER_LENGTH].offset = 4;
if (!_dbus_marshal_uint32 (&message->header, message->byte_order, 0))
return FALSE;
- message->header_fields[FIELD_BODY_LENGTH].offset = 8;
if (!_dbus_marshal_uint32 (&message->header, message->byte_order, 0))
return FALSE;
- message->header_fields[FIELD_CLIENT_SERIAL].offset = 12;
if (!_dbus_marshal_int32 (&message->header, message->byte_order, -1))
return FALSE;
@@ -911,8 +867,8 @@ dbus_message_create_header (DBusMessage *message,
if (path != NULL)
{
if (!append_string_field (message,
- FIELD_PATH, DBUS_TYPE_OBJECT_PATH,
DBUS_HEADER_FIELD_PATH,
+ DBUS_TYPE_OBJECT_PATH,
path))
return FALSE;
}
@@ -920,8 +876,8 @@ dbus_message_create_header (DBusMessage *message,
if (service != NULL)
{
if (!append_string_field (message,
- FIELD_SERVICE, DBUS_TYPE_STRING,
DBUS_HEADER_FIELD_SERVICE,
+ DBUS_TYPE_STRING,
service))
return FALSE;
}
@@ -929,8 +885,8 @@ dbus_message_create_header (DBusMessage *message,
if (interface != NULL)
{
if (!append_string_field (message,
- FIELD_INTERFACE, DBUS_TYPE_STRING,
DBUS_HEADER_FIELD_INTERFACE,
+ DBUS_TYPE_STRING,
interface))
return FALSE;
}
@@ -938,8 +894,8 @@ dbus_message_create_header (DBusMessage *message,
if (member != NULL)
{
if (!append_string_field (message,
- FIELD_MEMBER, DBUS_TYPE_STRING,
DBUS_HEADER_FIELD_MEMBER,
+ DBUS_TYPE_STRING,
member))
return FALSE;
}
@@ -947,8 +903,8 @@ dbus_message_create_header (DBusMessage *message,
if (error_name != NULL)
{
if (!append_string_field (message,
- FIELD_ERROR_NAME, DBUS_TYPE_STRING,
DBUS_HEADER_FIELD_ERROR_NAME,
+ DBUS_TYPE_STRING,
error_name))
return FALSE;
}
@@ -971,13 +927,15 @@ _dbus_message_lock (DBusMessage *message)
if (!message->locked)
{
/* Fill in our lengths */
- set_uint_field (message,
- FIELD_HEADER_LENGTH,
- _dbus_string_get_length (&message->header));
+ _dbus_marshal_set_uint32 (&message->header,
+ message->byte_order,
+ HEADER_LENGTH_OFFSET,
+ _dbus_string_get_length (&message->header));
- set_uint_field (message,
- FIELD_BODY_LENGTH,
- _dbus_string_get_length (&message->body));
+ _dbus_marshal_set_uint32 (&message->header,
+ message->byte_order,
+ BODY_LENGTH_OFFSET,
+ _dbus_string_get_length (&message->body));
message->locked = TRUE;
}
@@ -1023,7 +981,7 @@ dbus_message_new_empty_header (void)
_dbus_data_slot_list_init (&message->slot_list);
i = 0;
- while (i < FIELD_LAST)
+ while (i <= DBUS_HEADER_FIELD_LAST)
{
message->header_fields[i].offset = -1;
++i;
@@ -1136,7 +1094,8 @@ dbus_message_new_method_return (DBusMessage *method_call)
_dbus_return_val_if_fail (method_call != NULL, NULL);
sender = get_string_field (method_call,
- FIELD_SENDER_SERVICE, NULL);
+ DBUS_HEADER_FIELD_SENDER_SERVICE,
+ NULL);
/* sender is allowed to be null here in peer-to-peer case */
@@ -1222,7 +1181,8 @@ dbus_message_new_error (DBusMessage *reply_to,
_dbus_return_val_if_fail (error_name != NULL, NULL);
sender = get_string_field (reply_to,
- FIELD_SENDER_SERVICE, NULL);
+ DBUS_HEADER_FIELD_SENDER_SERVICE,
+ NULL);
/* sender may be NULL for non-message-bus case or
* when the message bus is dealing with an unregistered
@@ -1319,7 +1279,7 @@ dbus_message_copy (const DBusMessage *message)
return NULL;
}
- for (i = 0; i < FIELD_LAST; i++)
+ for (i = 0; i <= DBUS_HEADER_FIELD_LAST; i++)
{
retval->header_fields[i].offset = message->header_fields[i].offset;
}
@@ -1430,13 +1390,13 @@ dbus_message_set_path (DBusMessage *message,
if (object_path == NULL)
{
- delete_string_field (message, FIELD_PATH);
+ delete_string_field (message, DBUS_HEADER_FIELD_PATH);
return TRUE;
}
else
{
return set_string_field (message,
- FIELD_PATH,
+ DBUS_HEADER_FIELD_PATH,
DBUS_TYPE_OBJECT_PATH,
object_path);
}
@@ -1455,7 +1415,7 @@ dbus_message_get_path (DBusMessage *message)
{
_dbus_return_val_if_fail (message != NULL, NULL);
- return get_string_field (message, FIELD_PATH, NULL);
+ return get_string_field (message, DBUS_HEADER_FIELD_PATH, NULL);
}
/**
@@ -1480,7 +1440,8 @@ dbus_message_get_path_decomposed (DBusMessage *message,
_dbus_return_val_if_fail (message != NULL, FALSE);
_dbus_return_val_if_fail (path != NULL, FALSE);
- return get_path_field_decomposed (message, FIELD_PATH,
+ return get_path_field_decomposed (message,
+ DBUS_HEADER_FIELD_PATH,
path);
}
@@ -1503,13 +1464,13 @@ dbus_message_set_interface (DBusMessage *message,
if (interface == NULL)
{
- delete_string_field (message, FIELD_INTERFACE);
+ delete_string_field (message, DBUS_HEADER_FIELD_INTERFACE);
return TRUE;
}
else
{
return set_string_field (message,
- FIELD_INTERFACE,
+ DBUS_HEADER_FIELD_INTERFACE,
DBUS_TYPE_STRING,
interface);
}
@@ -1529,7 +1490,7 @@ dbus_message_get_interface (DBusMessage *message)
{
_dbus_return_val_if_fail (message != NULL, NULL);
- return get_string_field (message, FIELD_INTERFACE, NULL);
+ return get_string_field (message, DBUS_HEADER_FIELD_INTERFACE, NULL);
}
/**
@@ -1551,13 +1512,13 @@ dbus_message_set_member (DBusMessage *message,
if (member == NULL)
{
- delete_string_field (message, FIELD_MEMBER);
+ delete_string_field (message, DBUS_HEADER_FIELD_MEMBER);
return TRUE;
}
else
{
return set_string_field (message,
- FIELD_MEMBER,
+ DBUS_HEADER_FIELD_MEMBER,
DBUS_TYPE_STRING,
member);
}
@@ -1576,7 +1537,9 @@ dbus_message_get_member (DBusMessage *message)
{
_dbus_return_val_if_fail (message != NULL, NULL);
- return get_string_field (message, FIELD_MEMBER, NULL);
+ return get_string_field (message,
+ DBUS_HEADER_FIELD_MEMBER,
+ NULL);
}
/**
@@ -1596,13 +1559,14 @@ dbus_message_set_error_name (DBusMessage *message,
if (error_name == NULL)
{
- delete_string_field (message, FIELD_ERROR_NAME);
+ delete_string_field (message,
+ DBUS_HEADER_FIELD_ERROR_NAME);
return TRUE;
}
else
{
return set_string_field (message,
- FIELD_ERROR_NAME,
+ DBUS_HEADER_FIELD_ERROR_NAME,
DBUS_TYPE_STRING,
error_name);
}
@@ -1619,7 +1583,9 @@ dbus_message_get_error_name (DBusMessage *message)
{
_dbus_return_val_if_fail (message != NULL, NULL);
- return get_string_field (message, FIELD_ERROR_NAME, NULL);
+ return get_string_field (message,
+ DBUS_HEADER_FIELD_ERROR_NAME,
+ NULL);
}
/**
@@ -1638,13 +1604,13 @@ dbus_message_set_destination (DBusMessage *message,
if (destination == NULL)
{
- delete_string_field (message, FIELD_SERVICE);
+ delete_string_field (message, DBUS_HEADER_FIELD_SERVICE);
return TRUE;
}
else
{
return set_string_field (message,
- FIELD_SERVICE,
+ DBUS_HEADER_FIELD_SERVICE,
DBUS_TYPE_STRING,
destination);
}
@@ -1661,7 +1627,9 @@ dbus_message_get_destination (DBusMessage *message)
{
_dbus_return_val_if_fail (message != NULL, NULL);
- return get_string_field (message, FIELD_SERVICE, NULL);
+ return get_string_field (message,
+ DBUS_HEADER_FIELD_SERVICE,
+ NULL);
}
/**
@@ -4113,13 +4081,14 @@ dbus_message_set_sender (DBusMessage *message,
if (sender == NULL)
{
- delete_string_field (message, FIELD_SENDER_SERVICE);
+ delete_string_field (message,
+ DBUS_HEADER_FIELD_SENDER_SERVICE);
return TRUE;
}
else
{
return set_string_field (message,
- FIELD_SENDER_SERVICE,
+ DBUS_HEADER_FIELD_SENDER_SERVICE,
DBUS_TYPE_STRING,
sender);
}
@@ -4183,7 +4152,9 @@ dbus_message_get_sender (DBusMessage *message)
{
_dbus_return_val_if_fail (message != NULL, NULL);
- return get_string_field (message, FIELD_SENDER_SERVICE, NULL);
+ return get_string_field (message,
+ DBUS_HEADER_FIELD_SENDER_SERVICE,
+ NULL);
}
static dbus_bool_t
@@ -4566,63 +4537,31 @@ _dbus_message_loader_get_buffer (DBusMessageLoader *loader,
*/
#define DBUS_MINIMUM_HEADER_SIZE 16
-/** Pack four characters as in "abcd" into a uint32 */
-#define FOUR_CHARS_TO_UINT32(a, b, c, d) \
- ((((dbus_uint32_t)a) << 24) | \
- (((dbus_uint32_t)b) << 16) | \
- (((dbus_uint32_t)c) << 8) | \
- ((dbus_uint32_t)d))
-
-/** DBUS_HEADER_FIELD_PATH packed into a dbus_uint32_t */
-#define DBUS_HEADER_FIELD_PATH_AS_UINT32 \
- FOUR_CHARS_TO_UINT32 ('p', 'a', 't', 'h')
-
-/** DBUS_HEADER_FIELD_INTERFACE packed into a dbus_uint32_t */
-#define DBUS_HEADER_FIELD_INTERFACE_AS_UINT32 \
- FOUR_CHARS_TO_UINT32 ('i', 'f', 'c', 'e')
-
-/** DBUS_HEADER_FIELD_MEMBER packed into a dbus_uint32_t */
-#define DBUS_HEADER_FIELD_MEMBER_AS_UINT32 \
- FOUR_CHARS_TO_UINT32 ('m', 'e', 'b', 'r')
-
-/** DBUS_HEADER_FIELD_ERROR_NAME packed into a dbus_uint32_t */
-#define DBUS_HEADER_FIELD_ERROR_NAME_AS_UINT32 \
- FOUR_CHARS_TO_UINT32 ('e', 'r', 'n', 'm')
-
-/** DBUS_HEADER_FIELD_SERVICE packed into a dbus_uint32_t */
-#define DBUS_HEADER_FIELD_SERVICE_AS_UINT32 \
- FOUR_CHARS_TO_UINT32 ('s', 'r', 'v', 'c')
-
-/** DBUS_HEADER_FIELD_REPLY packed into a dbus_uint32_t */
-#define DBUS_HEADER_FIELD_REPLY_AS_UINT32 \
- FOUR_CHARS_TO_UINT32 ('r', 'p', 'l', 'y')
-
-/** DBUS_HEADER_FIELD_SENDER_SERVICE Packed into a dbus_uint32_t */
-#define DBUS_HEADER_FIELD_SENDER_SERVICE_AS_UINT32 \
- FOUR_CHARS_TO_UINT32 ('s', 'd', 'r', 's')
-
static dbus_bool_t
decode_string_field (const DBusString *data,
- HeaderField fields[FIELD_LAST],
+ int field,
+ HeaderField *header_field,
+ DBusString *field_data,
int pos,
- int type,
- int field,
- const char *field_name)
+ int type)
{
- DBusString tmp;
int string_data_pos;
+
+ _dbus_assert (header_field != NULL);
+ _dbus_assert (field_data != NULL);
- if (fields[field].offset >= 0)
+ if (header_field->offset >= 0)
{
_dbus_verbose ("%s field provided twice\n",
- field_name);
+ _dbus_header_field_to_string (field));
return FALSE;
}
if (type != DBUS_TYPE_STRING)
{
_dbus_verbose ("%s field has wrong type %s\n",
- field_name, _dbus_type_to_string (type));
+ _dbus_header_field_to_string (field),
+ _dbus_type_to_string (type));
return FALSE;
}
@@ -4633,63 +4572,15 @@ decode_string_field (const DBusString *data,
string_data_pos = _DBUS_ALIGN_VALUE (pos, 4) + 4;
_dbus_assert (string_data_pos < _dbus_string_get_length (data));
- _dbus_string_init_const (&tmp,
+ _dbus_string_init_const (field_data,
_dbus_string_get_const_data (data) + string_data_pos);
- if (field == FIELD_INTERFACE)
- {
- if (!_dbus_string_validate_interface (&tmp, 0, _dbus_string_get_length (&tmp)))
- {
- _dbus_verbose ("%s field has invalid content \"%s\"\n",
- field_name, _dbus_string_get_const_data (&tmp));
- return FALSE;
- }
-
- if (_dbus_string_equal_c_str (&tmp,
- DBUS_INTERFACE_ORG_FREEDESKTOP_LOCAL))
- {
- _dbus_verbose ("Message is on the local interface\n");
- return FALSE;
- }
- }
- else if (field == FIELD_MEMBER)
- {
- if (!_dbus_string_validate_member (&tmp, 0, _dbus_string_get_length (&tmp)))
- {
- _dbus_verbose ("%s field has invalid content \"%s\"\n",
- field_name, _dbus_string_get_const_data (&tmp));
- return FALSE;
- }
- }
- else if (field == FIELD_ERROR_NAME)
- {
- if (!_dbus_string_validate_error_name (&tmp, 0, _dbus_string_get_length (&tmp)))
- {
- _dbus_verbose ("%s field has invalid content \"%s\"\n",
- field_name, _dbus_string_get_const_data (&tmp));
- return FALSE;
- }
- }
- else if (field == FIELD_SERVICE ||
- field == FIELD_SENDER_SERVICE)
- {
- if (!_dbus_string_validate_service (&tmp, 0, _dbus_string_get_length (&tmp)))
- {
- _dbus_verbose ("%s field has invalid content \"%s\"\n",
- field_name, _dbus_string_get_const_data (&tmp));
- return FALSE;
- }
- }
- else
- {
- _dbus_assert_not_reached ("Unknown field\n");
- }
-
- fields[field].offset = _DBUS_ALIGN_VALUE (pos, 4);
+ header_field->offset = _DBUS_ALIGN_VALUE (pos, 4);
#if 0
- _dbus_verbose ("Found field %s name at offset %d\n",
- field_name, fields[field].offset);
+ _dbus_verbose ("Found field %s at offset %d\n",
+ _dbus_header_field_to_string (field),
+ header_field->offset);
#endif
return TRUE;
@@ -4700,12 +4591,13 @@ decode_header_data (const DBusString *data,
int header_len,
int byte_order,
int message_type,
- HeaderField fields[FIELD_LAST],
+ HeaderField fields[DBUS_HEADER_FIELD_LAST + 1],
int *message_padding)
{
- const char *field;
+ DBusString field_data;
int pos, new_pos;
int i;
+ int field;
int type;
if (header_len < 16)
@@ -4715,38 +4607,32 @@ decode_header_data (const DBusString *data,
}
i = 0;
- while (i < FIELD_LAST)
+ while (i <= DBUS_HEADER_FIELD_LAST)
{
fields[i].offset = -1;
++i;
}
- fields[FIELD_HEADER_LENGTH].offset = 4;
- fields[FIELD_BODY_LENGTH].offset = 8;
- fields[FIELD_CLIENT_SERIAL].offset = 12;
-
- /* Now handle the named fields. A real named field is at least 4
- * bytes for the name, plus a type code (1 byte) plus padding. So
- * if we have less than 8 bytes left, it must be alignment padding,
- * not a field. While >= 8 bytes can't be entirely alignment
- * padding.
+ /* Now handle the named fields. A real named field is at least 1
+ * byte for the name, plus a type code (1 byte) plus padding, plus
+ * the field value. So if we have less than 8 bytes left, it must
+ * be alignment padding, not a field. While >= 8 bytes can't be
+ * entirely alignment padding.
*/
pos = 16;
while ((pos + 7) < header_len)
{
pos = _DBUS_ALIGN_VALUE (pos, 4);
- if ((pos + 4) > header_len)
+ if ((pos + 1) > header_len)
{
_dbus_verbose ("not enough space remains in header for header field value\n");
return FALSE;
}
- field = _dbus_string_get_const_data_len (data, pos, 4);
- pos += 4;
+ field = _dbus_string_get_byte (data, pos);
+ pos += 1;
- _dbus_assert (_DBUS_ALIGN_ADDRESS (field, 4) == field);
-
if (!_dbus_marshal_validate_type (data, pos, &type, &pos))
{
_dbus_verbose ("Failed to validate type of named header field\n");
@@ -4765,71 +4651,112 @@ decode_header_data (const DBusString *data,
return FALSE;
}
- switch (DBUS_UINT32_FROM_BE (*(int*)field))
+ switch (field)
{
- case DBUS_HEADER_FIELD_SERVICE_AS_UINT32:
- if (!decode_string_field (data, fields, pos, type,
- FIELD_SERVICE,
- DBUS_HEADER_FIELD_SERVICE))
+ case DBUS_HEADER_FIELD_SERVICE:
+ if (!decode_string_field (data, field, &fields[field],
+ &field_data, pos, type))
return FALSE;
+
+ if (!_dbus_string_validate_service (&field_data, 0,
+ _dbus_string_get_length (&field_data)))
+ {
+ _dbus_verbose ("service field has invalid content \"%s\"\n",
+ _dbus_string_get_const_data (&field_data));
+ return FALSE;
+ }
break;
- case DBUS_HEADER_FIELD_INTERFACE_AS_UINT32:
- if (!decode_string_field (data, fields, pos, type,
- FIELD_INTERFACE,
- DBUS_HEADER_FIELD_INTERFACE))
+ case DBUS_HEADER_FIELD_INTERFACE:
+ if (!decode_string_field (data, field, &fields[field],
+ &field_data, pos, type))
return FALSE;
+
+ if (!_dbus_string_validate_interface (&field_data, 0,
+ _dbus_string_get_length (&field_data)))
+ {
+ _dbus_verbose ("interface field has invalid content \"%s\"\n",
+ _dbus_string_get_const_data (&field_data));
+ return FALSE;
+ }
+
+ if (_dbus_string_equal_c_str (&field_data,
+ DBUS_INTERFACE_ORG_FREEDESKTOP_LOCAL))
+ {
+ _dbus_verbose ("Message is on the local interface\n");
+ return FALSE;
+ }
break;
- case DBUS_HEADER_FIELD_MEMBER_AS_UINT32:
- if (!decode_string_field (data, fields, pos, type,
- FIELD_MEMBER,
- DBUS_HEADER_FIELD_MEMBER))
+ case DBUS_HEADER_FIELD_MEMBER:
+ if (!decode_string_field (data, field, &fields[field],
+ &field_data, pos, type))
return FALSE;
+
+ if (!_dbus_string_validate_member (&field_data, 0,
+ _dbus_string_get_length (&field_data)))
+ {
+ _dbus_verbose ("member field has invalid content \"%s\"\n",
+ _dbus_string_get_const_data (&field_data));
+ return FALSE;
+ }
break;
- case DBUS_HEADER_FIELD_ERROR_NAME_AS_UINT32:
- if (!decode_string_field (data, fields, pos, type,
- FIELD_ERROR_NAME,
- DBUS_HEADER_FIELD_ERROR_NAME))
+ case DBUS_HEADER_FIELD_ERROR_NAME:
+ if (!decode_string_field (data, field, &fields[field],
+ &field_data, pos, type))
return FALSE;
+
+ if (!_dbus_string_validate_error_name (&field_data, 0,
+ _dbus_string_get_length (&field_data)))
+ {
+ _dbus_verbose ("error-name field has invalid content \"%s\"\n",
+ _dbus_string_get_const_data (&field_data));
+ return FALSE;
+ }
break;
- case DBUS_HEADER_FIELD_SENDER_SERVICE_AS_UINT32:
- if (!decode_string_field (data, fields, pos, type,
- FIELD_SENDER_SERVICE,
- DBUS_HEADER_FIELD_SENDER_SERVICE))
+ case DBUS_HEADER_FIELD_SENDER_SERVICE:
+ if (!decode_string_field (data, field, &fields[field],
+ &field_data, pos, type))
return FALSE;
+
+ if (!_dbus_string_validate_service (&field_data, 0,
+ _dbus_string_get_length (&field_data)))
+ {
+ _dbus_verbose ("sender-service field has invalid content \"%s\"\n",
+ _dbus_string_get_const_data (&field_data));
+ return FALSE;
+ }
break;
- case DBUS_HEADER_FIELD_PATH_AS_UINT32:
+ case DBUS_HEADER_FIELD_PATH:
/* Path was already validated as part of standard
* type validation, since there's an OBJECT_PATH
* type.
*/
- if (fields[FIELD_PATH].offset >= 0)
+ if (fields[field].offset >= 0)
{
- _dbus_verbose ("%s field provided twice\n",
- DBUS_HEADER_FIELD_PATH);
+ _dbus_verbose ("path field provided twice\n");
return FALSE;
}
if (type != DBUS_TYPE_OBJECT_PATH)
{
- _dbus_verbose ("%s field has wrong type\n", DBUS_HEADER_FIELD_PATH);
+ _dbus_verbose ("path field has wrong type\n");
return FALSE;
}
- fields[FIELD_PATH].offset = _DBUS_ALIGN_VALUE (pos, 4);
+ fields[field].offset = _DBUS_ALIGN_VALUE (pos, 4);
/* No forging signals from the local path */
{
const char *s;
s = _dbus_string_get_const_data_len (data,
- fields[FIELD_PATH].offset,
+ fields[field].offset,
_dbus_string_get_length (data) -
- fields[FIELD_PATH].offset);
+ fields[field].offset);
if (strcmp (s, DBUS_PATH_ORG_FREEDESKTOP_LOCAL) == 0)
{
_dbus_verbose ("Message is on the local path\n");
@@ -4838,31 +4765,30 @@ decode_header_data (const DBusString *data,
}
_dbus_verbose ("Found path at offset %d\n",
- fields[FIELD_PATH].offset);
+ fields[field].offset);
break;
- case DBUS_HEADER_FIELD_REPLY_AS_UINT32:
- if (fields[FIELD_REPLY_SERIAL].offset >= 0)
+ case DBUS_HEADER_FIELD_REPLY_SERIAL:
+ if (fields[field].offset >= 0)
{
- _dbus_verbose ("%s field provided twice\n",
- DBUS_HEADER_FIELD_REPLY);
+ _dbus_verbose ("reply field provided twice\n");
return FALSE;
}
if (type != DBUS_TYPE_UINT32)
{
- _dbus_verbose ("%s field has wrong type\n", DBUS_HEADER_FIELD_REPLY);
+ _dbus_verbose ("reply field has wrong type\n");
return FALSE;
}
- fields[FIELD_REPLY_SERIAL].offset = _DBUS_ALIGN_VALUE (pos, 4);
+ fields[field].offset = _DBUS_ALIGN_VALUE (pos, 4);
_dbus_verbose ("Found reply serial at offset %d\n",
- fields[FIELD_REPLY_SERIAL].offset);
+ fields[field].offset);
break;
default:
- _dbus_verbose ("Ignoring an unknown header field: %.4s at offset %d\n",
+ _dbus_verbose ("Ignoring an unknown header field: %d at offset %d\n",
field, pos);
}
@@ -4887,31 +4813,27 @@ decode_header_data (const DBusString *data,
{
case DBUS_MESSAGE_TYPE_SIGNAL:
case DBUS_MESSAGE_TYPE_METHOD_CALL:
- if (fields[FIELD_PATH].offset < 0)
+ if (fields[DBUS_HEADER_FIELD_PATH].offset < 0)
{
- _dbus_verbose ("No %s field provided\n",
- DBUS_HEADER_FIELD_PATH);
+ _dbus_verbose ("No path field provided\n");
return FALSE;
}
/* FIXME make this optional, at least for method calls */
- if (fields[FIELD_INTERFACE].offset < 0)
+ if (fields[DBUS_HEADER_FIELD_INTERFACE].offset < 0)
{
- _dbus_verbose ("No %s field provided\n",
- DBUS_HEADER_FIELD_INTERFACE);
+ _dbus_verbose ("No interface field provided\n");
return FALSE;
}
- if (fields[FIELD_MEMBER].offset < 0)
+ if (fields[DBUS_HEADER_FIELD_MEMBER].offset < 0)
{
- _dbus_verbose ("No %s field provided\n",
- DBUS_HEADER_FIELD_MEMBER);
+ _dbus_verbose ("No member field provided\n");
return FALSE;
}
break;
case DBUS_MESSAGE_TYPE_ERROR:
- if (fields[FIELD_ERROR_NAME].offset < 0)
+ if (fields[DBUS_HEADER_FIELD_ERROR_NAME].offset < 0)
{
- _dbus_verbose ("No %s field provided\n",
- DBUS_HEADER_FIELD_ERROR_NAME);
+ _dbus_verbose ("No error-name field provided\n");
return FALSE;
}
break;
@@ -5056,7 +4978,7 @@ _dbus_message_loader_queue_messages (DBusMessageLoader *loader)
if (_dbus_string_get_length (&loader->data) >= (header_len + body_len))
{
- HeaderField fields[FIELD_LAST];
+ HeaderField fields[DBUS_HEADER_FIELD_LAST + 1];
int i;
int next_arg;
@@ -5123,7 +5045,7 @@ _dbus_message_loader_queue_messages (DBusMessageLoader *loader)
/* Copy in the offsets we found */
i = 0;
- while (i < FIELD_LAST)
+ while (i <= DBUS_HEADER_FIELD_LAST)
{
message->header_fields[i] = fields[i];
++i;
@@ -5173,9 +5095,12 @@ _dbus_message_loader_queue_messages (DBusMessageLoader *loader)
* earlier)
*/
message->reply_serial = get_uint_field (message,
- FIELD_REPLY_SERIAL);
- message->client_serial = get_uint_field (message,
- FIELD_CLIENT_SERIAL);
+ DBUS_HEADER_FIELD_REPLY_SERIAL);
+
+ message->client_serial = _dbus_demarshal_uint32 (&message->header,
+ message->byte_order,
+ CLIENT_SERIAL_OFFSET,
+ NULL);
_dbus_verbose ("Loaded message %p\n", message);
}
@@ -5751,8 +5676,10 @@ check_message_handling (DBusMessage *message)
client_serial = dbus_message_get_serial (message);
/* can't use set_serial due to the assertions at the start of it */
- set_uint_field (message, FIELD_CLIENT_SERIAL,
- client_serial);
+ _dbus_marshal_set_uint32 (&message->header,
+ message->byte_order,
+ CLIENT_SERIAL_OFFSET,
+ client_serial);
if (client_serial != dbus_message_get_serial (message))
{