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",
173 _dbus_header_cache_revalidate (
DBusHeader *header)
188 &_dbus_header_signature_str,
199 unsigned char field_code;
215 _dbus_header_cache_one (header, field_code, &variant);
235 if (header->
fields[field].
value_pos == _DBUS_HEADER_FIELD_VALUE_UNKNOWN)
236 _dbus_header_cache_revalidate (header);
238 if (header->
fields[field].
value_pos == _DBUS_HEADER_FIELD_VALUE_NONEXISTENT)
253 _dbus_header_cache_known_nonexistent (
DBusHeader *header,
258 return (header->
fields[field].
value_pos == _DBUS_HEADER_FIELD_VALUE_NONEXISTENT);
279 unsigned char field_byte;
300 &contained_type, 0, &variant))
343 #ifndef DBUS_DISABLE_ASSERT
345 unsigned char v_BYTE;
436 _dbus_header_cache_invalidate_all (header);
518 const char *destination,
520 const char *interface,
522 const char *error_name)
524 unsigned char v_BYTE;
531 !(interface || member || error_name));
534 if (!reserve_header_padding (header))
538 &_dbus_header_signature_str, 0,
547 v_BYTE = message_type;
573 &_dbus_header_signature_str,
582 if (!write_basic_field (&array,
589 if (destination !=
NULL)
591 if (!write_basic_field (&array,
598 if (interface !=
NULL)
600 if (!write_basic_field (&array,
609 if (!write_basic_field (&array,
616 if (error_name !=
NULL)
618 if (!write_basic_field (&array,
628 correct_header_padding (header);
635 correct_header_padding (header);
661 int *fields_array_len,
677 _dbus_assert (start == (
int) _DBUS_ALIGN_VALUE (start, 8));
683 *validity = DBUS_INVALID_BAD_BYTE_ORDER;
691 if (fields_array_len_unsigned > (
unsigned) max_message_length)
693 *validity = DBUS_INVALID_INSANE_FIELDS_ARRAY_LENGTH;
701 if (body_len_unsigned > (
unsigned) max_message_length)
703 *validity = DBUS_INVALID_INSANE_BODY_LENGTH;
708 header_len_unsigned = _DBUS_ALIGN_VALUE (header_len_unsigned, 8);
714 if (body_len_unsigned + header_len_unsigned > (
unsigned) max_message_length)
716 *validity = DBUS_INVALID_MESSAGE_TOO_LONG;
721 _dbus_assert (fields_array_len_unsigned < (
unsigned) _DBUS_INT32_MAX);
722 _dbus_assert (header_len_unsigned < (
unsigned) _DBUS_INT32_MAX);
724 *body_len = body_len_unsigned;
725 *fields_array_len = fields_array_len_unsigned;
726 *header_len = header_len_unsigned;
730 _dbus_verbose (
"have %d bytes, need body %u + header %u = %u\n",
731 len, body_len_unsigned, header_len_unsigned,
732 body_len_unsigned + header_len_unsigned);
734 return (body_len_unsigned + header_len_unsigned) <= (unsigned) len;
740 #define REQUIRE_FIELD(name) do { if (header->fields[DBUS_HEADER_FIELD_##name].value_pos < 0) return DBUS_INVALID_MISSING_##name; } while (0)
745 REQUIRE_FIELD (INTERFACE);
748 REQUIRE_FIELD (PATH);
749 REQUIRE_FIELD (MEMBER);
752 REQUIRE_FIELD (ERROR_NAME);
753 REQUIRE_FIELD (REPLY_SERIAL);
756 REQUIRE_FIELD (REPLY_SERIAL);
788 _dbus_assert (_dbus_header_field_types[field].code == field);
791 if (type != expected_type)
793 _dbus_verbose (
"Field %d should have type %d but has %d\n",
794 field, expected_type, type);
795 return DBUS_INVALID_HEADER_FIELD_HAS_WRONG_TYPE;
801 _dbus_verbose (
"Header field %d seen a second time\n", field);
802 return DBUS_INVALID_HEADER_FIELD_APPEARS_TWICE;
806 _dbus_verbose (
"initially caching field %d\n", field);
807 _dbus_header_cache_one (header, field, variant_reader);
809 string_validation_func =
NULL;
828 &value_str, &value_pos);
829 str_data_pos = _DBUS_ALIGN_VALUE (value_pos, 4) + 4;
840 bad_string_code = DBUS_INVALID_BAD_DESTINATION;
844 bad_string_code = DBUS_INVALID_BAD_INTERFACE;
849 value_str, str_data_pos))
851 _dbus_verbose (
"Message is on the local interface\n");
852 return DBUS_INVALID_USES_LOCAL_INTERFACE;
858 bad_string_code = DBUS_INVALID_BAD_MEMBER;
863 bad_string_code = DBUS_INVALID_BAD_ERROR_NAME;
868 bad_string_code = DBUS_INVALID_BAD_SENDER;
873 string_validation_func =
NULL;
878 value_str, str_data_pos))
880 _dbus_verbose (
"Message is from the local path\n");
881 return DBUS_INVALID_USES_LOCAL_PATH;
889 return DBUS_INVALID_BAD_SERIAL;
899 string_validation_func =
NULL;
907 if (string_validation_func)
917 _dbus_verbose (
"Validating string header field; code %d if fails\n",
920 if (!(*string_validation_func) (value_str, str_data_pos, len))
921 return bad_string_code;
958 int fields_array_len,
969 unsigned char v_byte;
976 _dbus_assert (start == (
int) _DBUS_ALIGN_VALUE (start, 8));
982 _dbus_verbose (
"Failed to copy buffer into new header\n");
987 if (mode == DBUS_VALIDATION_MODE_WE_TRUST_THIS_DATA_ABSOLUTELY)
989 leftover = len - header_len - body_len - start;
1009 _dbus_assert (start + header_len == (
int) _DBUS_ALIGN_VALUE (padding_start, 8));
1010 _dbus_assert (start + header_len == padding_start + padding_len);
1012 if (mode != DBUS_VALIDATION_MODE_WE_TRUST_THIS_DATA_ABSOLUTELY)
1016 *validity = DBUS_INVALID_ALIGNMENT_PADDING_NOT_NUL;
1021 header->
padding = padding_len;
1023 if (mode == DBUS_VALIDATION_MODE_WE_TRUST_THIS_DATA_ABSOLUTELY)
1035 &_dbus_header_signature_str, 0,
1058 *validity = DBUS_INVALID_BAD_MESSAGE_TYPE;
1078 *validity = DBUS_INVALID_BAD_PROTOCOL_VERSION;
1098 *validity = DBUS_INVALID_BAD_SERIAL;
1110 unsigned char field_code;
1122 _dbus_verbose (
"invalid header field code\n");
1123 *validity = DBUS_INVALID_HEADER_FIELD_CODE;
1129 _dbus_verbose (
"unknown header field code %d, skipping\n",
1137 v = load_and_validate_field (header, field_code, &variant_reader);
1140 _dbus_verbose (
"Field %d was invalid\n", field_code);
1158 v = check_mandatory_fields (header);
1161 _dbus_verbose (
"Mandatory fields were missing, code %d\n", v);
1191 find_field_for_modification (
DBusHeader *header,
1202 &_dbus_header_signature_str,
1212 unsigned char field_code;
1219 if (field_code == (
unsigned) field)
1252 if (!reserve_header_padding (header))
1256 if (_dbus_header_cache_check (header, field))
1261 if (!find_field_for_modification (header, field,
1262 &reader, &realign_root))
1265 if (!set_basic_field (&reader, field, type, value, &realign_root))
1275 &_dbus_header_signature_str,
1284 &_dbus_header_signature_str,
1293 if (!write_basic_field (&array,
1294 field, type, value))
1301 correct_header_padding (header);
1307 _dbus_header_cache_invalidate_all (header);
1330 _dbus_assert (_dbus_header_field_types[field].code == field);
1337 if (!_dbus_header_cache_check (header, field))
1369 if (!_dbus_header_cache_check (header, field))
1373 *str = &header->
data;
1394 if (_dbus_header_cache_known_nonexistent (header, field))
1400 if (!find_field_for_modification (header, field,
1401 &reader, &realign_root))
1404 if (!reserve_header_padding (header))
1411 correct_header_padding (header);
1413 _dbus_header_cache_invalidate_all (header);
1415 _dbus_assert (!_dbus_header_cache_check (header, field));
1433 unsigned char *flags_p;
1454 const unsigned char *flags_p;
1458 return (*flags_p & flag) != 0;
1484 #ifdef DBUS_BUILD_TESTS
1485 #include "dbus-test.h"
1489 _dbus_marshal_header_test (
void)