25 #include "dbus/dbus-shared.h"
26 #include "dbus-marshal-header.h"
27 #include "dbus-marshal-recursive.h"
28 #include "dbus-marshal-byteswap.h"
47 #define FIELDS_ARRAY_SIGNATURE_OFFSET 6
49 #define FIELDS_ARRAY_ELEMENT_SIGNATURE_OFFSET 7
53 #define BYTE_ORDER_OFFSET 0
57 #define FLAGS_OFFSET 2
59 #define VERSION_OFFSET 3
61 #define BODY_LENGTH_OFFSET 4
63 #define SERIAL_OFFSET 8
65 #define FIELDS_ARRAY_LENGTH_OFFSET 12
67 #define FIRST_FIELD_OFFSET 16
90 #define EXPECTED_TYPE_OF_FIELD(field) (_dbus_header_field_types[field].type)
93 #define MAX_POSSIBLE_HEADER_PADDING 7
123 #define HEADER_END_BEFORE_PADDING(header) \
124 (_dbus_string_get_length (&(header)->data) - (header)->padding)
134 _dbus_header_cache_invalidate_all (
DBusHeader *header)
162 _dbus_verbose (
"cached value_pos %d for field %d\n",
187 _dbus_header_cache_revalidate (
DBusHeader *header)
202 &_dbus_header_signature_str,
213 unsigned char field_code;
229 _dbus_header_cache_one (header, field_code, &variant);
249 if (header->
fields[field].
value_pos == _DBUS_HEADER_FIELD_VALUE_UNKNOWN)
250 _dbus_header_cache_revalidate (header);
252 if (header->
fields[field].
value_pos == _DBUS_HEADER_FIELD_VALUE_NONEXISTENT)
267 _dbus_header_cache_known_nonexistent (
DBusHeader *header,
272 return (header->
fields[field].
value_pos == _DBUS_HEADER_FIELD_VALUE_NONEXISTENT);
294 unsigned char field_byte;
315 &contained_type, 0, &variant))
359 #ifndef DBUS_DISABLE_ASSERT
361 unsigned char v_BYTE;
449 _dbus_header_cache_invalidate_all (header);
531 const char *destination,
533 const char *interface,
535 const char *error_name)
537 unsigned char v_BYTE;
546 !(interface || member || error_name));
549 if (!reserve_header_padding (header))
553 &_dbus_header_signature_str, 0,
562 v_BYTE = message_type;
588 &_dbus_header_signature_str,
597 if (!write_basic_field (&array,
604 if (destination !=
NULL)
606 if (!write_basic_field (&array,
613 if (interface !=
NULL)
615 if (!write_basic_field (&array,
624 if (!write_basic_field (&array,
631 if (error_name !=
NULL)
633 if (!write_basic_field (&array,
643 correct_header_padding (header);
650 correct_header_padding (header);
676 int *fields_array_len,
692 _dbus_assert (start == (
int) _DBUS_ALIGN_VALUE (start, 8));
698 *validity = DBUS_INVALID_BAD_BYTE_ORDER;
706 if (fields_array_len_unsigned > (
unsigned) max_message_length)
708 *validity = DBUS_INVALID_INSANE_FIELDS_ARRAY_LENGTH;
716 if (body_len_unsigned > (
unsigned) max_message_length)
718 *validity = DBUS_INVALID_INSANE_BODY_LENGTH;
723 header_len_unsigned = _DBUS_ALIGN_VALUE (header_len_unsigned, 8);
729 if (body_len_unsigned + header_len_unsigned > (
unsigned) max_message_length)
731 *validity = DBUS_INVALID_MESSAGE_TOO_LONG;
736 _dbus_assert (fields_array_len_unsigned < (
unsigned) _DBUS_INT32_MAX);
737 _dbus_assert (header_len_unsigned < (
unsigned) _DBUS_INT32_MAX);
739 *body_len = body_len_unsigned;
740 *fields_array_len = fields_array_len_unsigned;
741 *header_len = header_len_unsigned;
745 _dbus_verbose (
"have %d bytes, need body %u + header %u = %u\n",
746 len, body_len_unsigned, header_len_unsigned,
747 body_len_unsigned + header_len_unsigned);
749 return (body_len_unsigned + header_len_unsigned) <= (unsigned) len;
755 #define REQUIRE_FIELD(name) do { if (header->fields[DBUS_HEADER_FIELD_##name].value_pos < 0) return DBUS_INVALID_MISSING_##name; } while (0)
760 REQUIRE_FIELD (INTERFACE);
763 REQUIRE_FIELD (PATH);
764 REQUIRE_FIELD (MEMBER);
767 REQUIRE_FIELD (ERROR_NAME);
768 REQUIRE_FIELD (REPLY_SERIAL);
771 REQUIRE_FIELD (REPLY_SERIAL);
803 _dbus_assert (_dbus_header_field_types[field].code == field);
806 if (type != expected_type)
808 _dbus_verbose (
"Field %d should have type %d but has %d\n",
809 field, expected_type, type);
810 return DBUS_INVALID_HEADER_FIELD_HAS_WRONG_TYPE;
816 _dbus_verbose (
"Header field %d seen a second time\n", field);
817 return DBUS_INVALID_HEADER_FIELD_APPEARS_TWICE;
821 _dbus_verbose (
"initially caching field %d\n", field);
822 _dbus_header_cache_one (header, field, variant_reader);
824 string_validation_func =
NULL;
843 &value_str, &value_pos);
844 str_data_pos = _DBUS_ALIGN_VALUE (value_pos, 4) + 4;
855 bad_string_code = DBUS_INVALID_BAD_DESTINATION;
859 bad_string_code = DBUS_INVALID_BAD_INTERFACE;
864 value_str, str_data_pos))
866 _dbus_verbose (
"Message is on the local interface\n");
867 return DBUS_INVALID_USES_LOCAL_INTERFACE;
873 bad_string_code = DBUS_INVALID_BAD_MEMBER;
878 bad_string_code = DBUS_INVALID_BAD_ERROR_NAME;
883 bad_string_code = DBUS_INVALID_BAD_SENDER;
888 string_validation_func =
NULL;
893 value_str, str_data_pos))
895 _dbus_verbose (
"Message is from the local path\n");
896 return DBUS_INVALID_USES_LOCAL_PATH;
904 return DBUS_INVALID_BAD_SERIAL;
914 string_validation_func =
NULL;
922 if (string_validation_func)
933 _dbus_verbose (
"Validating string header field; code %d if fails\n",
936 if (!(*string_validation_func) (value_str, str_data_pos, len))
937 return bad_string_code;
974 int fields_array_len,
985 unsigned char v_byte;
992 _dbus_assert (start == (
int) _DBUS_ALIGN_VALUE (start, 8));
998 _dbus_verbose (
"Failed to copy buffer into new header\n");
1003 if (mode == DBUS_VALIDATION_MODE_WE_TRUST_THIS_DATA_ABSOLUTELY)
1005 leftover = len - header_len - body_len - start;
1025 _dbus_assert (start + header_len == (
int) _DBUS_ALIGN_VALUE (padding_start, 8));
1026 _dbus_assert (start + header_len == padding_start + padding_len);
1028 if (mode != DBUS_VALIDATION_MODE_WE_TRUST_THIS_DATA_ABSOLUTELY)
1032 *validity = DBUS_INVALID_ALIGNMENT_PADDING_NOT_NUL;
1037 header->
padding = padding_len;
1039 if (mode == DBUS_VALIDATION_MODE_WE_TRUST_THIS_DATA_ABSOLUTELY)
1051 &_dbus_header_signature_str, 0,
1073 *validity = DBUS_INVALID_BAD_MESSAGE_TYPE;
1093 *validity = DBUS_INVALID_BAD_PROTOCOL_VERSION;
1113 *validity = DBUS_INVALID_BAD_SERIAL;
1125 unsigned char field_code;
1137 _dbus_verbose (
"invalid header field code\n");
1138 *validity = DBUS_INVALID_HEADER_FIELD_CODE;
1144 _dbus_verbose (
"unknown header field code %d, skipping\n",
1152 v = load_and_validate_field (header, field_code, &variant_reader);
1155 _dbus_verbose (
"Field %d was invalid\n", field_code);
1173 v = check_mandatory_fields (header);
1176 _dbus_verbose (
"Mandatory fields were missing, code %d\n", v);
1219 find_field_for_modification (
DBusHeader *header,
1230 &_dbus_header_signature_str,
1240 unsigned char field_code;
1247 if (field_code == (
unsigned) field)
1280 if (!reserve_header_padding (header))
1284 if (_dbus_header_cache_check (header, field))
1289 if (!find_field_for_modification (header, field,
1290 &reader, &realign_root))
1293 if (!set_basic_field (&reader, field, type, value, &realign_root))
1303 &_dbus_header_signature_str,
1312 &_dbus_header_signature_str,
1321 if (!write_basic_field (&array,
1322 field, type, value))
1329 correct_header_padding (header);
1335 _dbus_header_cache_invalidate_all (header);
1358 _dbus_assert (_dbus_header_field_types[field].code == field);
1365 if (!_dbus_header_cache_check (header, field))
1397 if (!_dbus_header_cache_check (header, field))
1401 *str = &header->
data;
1422 if (_dbus_header_cache_known_nonexistent (header, field))
1428 if (!find_field_for_modification (header, field,
1429 &reader, &realign_root))
1432 if (!reserve_header_padding (header))
1439 correct_header_padding (header);
1441 _dbus_header_cache_invalidate_all (header);
1443 _dbus_assert (!_dbus_header_cache_check (header, field));
1461 unsigned char *flags_p;
1482 const unsigned char *flags_p;
1484 flags_p = _dbus_string_get_const_udata_len (&header->
data,
FLAGS_OFFSET, 1);
1486 return (*flags_p & flag) != 0;
1503 if (byte_order == new_order)