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);
293 unsigned char field_byte;
314 &contained_type, 0, &variant))
357 #ifndef DBUS_DISABLE_ASSERT
359 unsigned char v_BYTE;
447 _dbus_header_cache_invalidate_all (header);
529 const char *destination,
531 const char *interface,
533 const char *error_name)
535 unsigned char v_BYTE;
544 !(interface || member || error_name));
547 if (!reserve_header_padding (header))
551 &_dbus_header_signature_str, 0,
560 v_BYTE = message_type;
586 &_dbus_header_signature_str,
595 if (!write_basic_field (&array,
602 if (destination !=
NULL)
604 if (!write_basic_field (&array,
611 if (interface !=
NULL)
613 if (!write_basic_field (&array,
622 if (!write_basic_field (&array,
629 if (error_name !=
NULL)
631 if (!write_basic_field (&array,
641 correct_header_padding (header);
648 correct_header_padding (header);
674 int *fields_array_len,
690 _dbus_assert (start == (
int) _DBUS_ALIGN_VALUE (start, 8));
696 *validity = DBUS_INVALID_BAD_BYTE_ORDER;
704 if (fields_array_len_unsigned > (
unsigned) max_message_length)
706 *validity = DBUS_INVALID_INSANE_FIELDS_ARRAY_LENGTH;
714 if (body_len_unsigned > (
unsigned) max_message_length)
716 *validity = DBUS_INVALID_INSANE_BODY_LENGTH;
721 header_len_unsigned = _DBUS_ALIGN_VALUE (header_len_unsigned, 8);
727 if (body_len_unsigned + header_len_unsigned > (
unsigned) max_message_length)
729 *validity = DBUS_INVALID_MESSAGE_TOO_LONG;
734 _dbus_assert (fields_array_len_unsigned < (
unsigned) _DBUS_INT32_MAX);
735 _dbus_assert (header_len_unsigned < (
unsigned) _DBUS_INT32_MAX);
737 *body_len = body_len_unsigned;
738 *fields_array_len = fields_array_len_unsigned;
739 *header_len = header_len_unsigned;
743 _dbus_verbose (
"have %d bytes, need body %u + header %u = %u\n",
744 len, body_len_unsigned, header_len_unsigned,
745 body_len_unsigned + header_len_unsigned);
747 return (body_len_unsigned + header_len_unsigned) <= (unsigned) len;
753 #define REQUIRE_FIELD(name) do { if (header->fields[DBUS_HEADER_FIELD_##name].value_pos < 0) return DBUS_INVALID_MISSING_##name; } while (0)
758 REQUIRE_FIELD (INTERFACE);
761 REQUIRE_FIELD (PATH);
762 REQUIRE_FIELD (MEMBER);
765 REQUIRE_FIELD (ERROR_NAME);
766 REQUIRE_FIELD (REPLY_SERIAL);
769 REQUIRE_FIELD (REPLY_SERIAL);
801 _dbus_assert (_dbus_header_field_types[field].code == field);
804 if (type != expected_type)
806 _dbus_verbose (
"Field %d should have type %d but has %d\n",
807 field, expected_type, type);
808 return DBUS_INVALID_HEADER_FIELD_HAS_WRONG_TYPE;
814 _dbus_verbose (
"Header field %d seen a second time\n", field);
815 return DBUS_INVALID_HEADER_FIELD_APPEARS_TWICE;
819 _dbus_verbose (
"initially caching field %d\n", field);
820 _dbus_header_cache_one (header, field, variant_reader);
822 string_validation_func =
NULL;
841 &value_str, &value_pos);
842 str_data_pos = _DBUS_ALIGN_VALUE (value_pos, 4) + 4;
853 bad_string_code = DBUS_INVALID_BAD_DESTINATION;
857 bad_string_code = DBUS_INVALID_BAD_INTERFACE;
862 value_str, str_data_pos))
864 _dbus_verbose (
"Message is on the local interface\n");
865 return DBUS_INVALID_USES_LOCAL_INTERFACE;
871 bad_string_code = DBUS_INVALID_BAD_MEMBER;
876 bad_string_code = DBUS_INVALID_BAD_ERROR_NAME;
881 bad_string_code = DBUS_INVALID_BAD_SENDER;
886 string_validation_func =
NULL;
891 value_str, str_data_pos))
893 _dbus_verbose (
"Message is from the local path\n");
894 return DBUS_INVALID_USES_LOCAL_PATH;
902 return DBUS_INVALID_BAD_SERIAL;
912 string_validation_func =
NULL;
920 if (string_validation_func)
931 _dbus_verbose (
"Validating string header field; code %d if fails\n",
934 if (!(*string_validation_func) (value_str, str_data_pos, len))
935 return bad_string_code;
972 int fields_array_len,
983 unsigned char v_byte;
990 _dbus_assert (start == (
int) _DBUS_ALIGN_VALUE (start, 8));
996 _dbus_verbose (
"Failed to copy buffer into new header\n");
1001 if (mode == DBUS_VALIDATION_MODE_WE_TRUST_THIS_DATA_ABSOLUTELY)
1003 leftover = len - header_len - body_len - start;
1023 _dbus_assert (start + header_len == (
int) _DBUS_ALIGN_VALUE (padding_start, 8));
1024 _dbus_assert (start + header_len == padding_start + padding_len);
1026 if (mode != DBUS_VALIDATION_MODE_WE_TRUST_THIS_DATA_ABSOLUTELY)
1030 *validity = DBUS_INVALID_ALIGNMENT_PADDING_NOT_NUL;
1035 header->
padding = padding_len;
1037 if (mode == DBUS_VALIDATION_MODE_WE_TRUST_THIS_DATA_ABSOLUTELY)
1049 &_dbus_header_signature_str, 0,
1071 *validity = DBUS_INVALID_BAD_MESSAGE_TYPE;
1091 *validity = DBUS_INVALID_BAD_PROTOCOL_VERSION;
1111 *validity = DBUS_INVALID_BAD_SERIAL;
1123 unsigned char field_code;
1135 _dbus_verbose (
"invalid header field code\n");
1136 *validity = DBUS_INVALID_HEADER_FIELD_CODE;
1142 _dbus_verbose (
"unknown header field code %d, skipping\n",
1150 v = load_and_validate_field (header, field_code, &variant_reader);
1153 _dbus_verbose (
"Field %d was invalid\n", field_code);
1171 v = check_mandatory_fields (header);
1174 _dbus_verbose (
"Mandatory fields were missing, code %d\n", v);
1217 find_field_for_modification (
DBusHeader *header,
1228 &_dbus_header_signature_str,
1238 unsigned char field_code;
1245 if (field_code == (
unsigned) field)
1278 if (!reserve_header_padding (header))
1282 if (_dbus_header_cache_check (header, field))
1287 if (!find_field_for_modification (header, field,
1288 &reader, &realign_root))
1291 if (!set_basic_field (&reader, field, type, value, &realign_root))
1301 &_dbus_header_signature_str,
1310 &_dbus_header_signature_str,
1319 if (!write_basic_field (&array,
1320 field, type, value))
1327 correct_header_padding (header);
1333 _dbus_header_cache_invalidate_all (header);
1356 _dbus_assert (_dbus_header_field_types[field].code == field);
1363 if (!_dbus_header_cache_check (header, field))
1395 if (!_dbus_header_cache_check (header, field))
1399 *str = &header->
data;
1420 if (_dbus_header_cache_known_nonexistent (header, field))
1426 if (!find_field_for_modification (header, field,
1427 &reader, &realign_root))
1430 if (!reserve_header_padding (header))
1437 correct_header_padding (header);
1439 _dbus_header_cache_invalidate_all (header);
1441 _dbus_assert (!_dbus_header_cache_check (header, field));
1459 unsigned char *flags_p;
1480 const unsigned char *flags_p;
1484 return (*flags_p & flag) != 0;
1501 if (byte_order == new_order)