diff options
Diffstat (limited to 'dbus/dbus-marshal-validate.c')
| -rw-r--r-- | dbus/dbus-marshal-validate.c | 26 | 
1 files changed, 21 insertions, 5 deletions
diff --git a/dbus/dbus-marshal-validate.c b/dbus/dbus-marshal-validate.c index b144b62a..f7b46c0b 100644 --- a/dbus/dbus-marshal-validate.c +++ b/dbus/dbus-marshal-validate.c @@ -144,8 +144,16 @@ _dbus_validate_signature_with_reason (const DBusString *type_str,            return DBUS_INVALID_UNKNOWN_TYPECODE;          } -      if (*p != DBUS_TYPE_ARRAY) -        array_depth = 0; +      if (array_depth > 0) +        { +          if (*p == DBUS_TYPE_ARRAY) +            ; +          else if (*p == DBUS_STRUCT_END_CHAR || +                   *p == DBUS_DICT_ENTRY_END_CHAR) +            return DBUS_INVALID_MISSING_ARRAY_ELEMENT_TYPE; +          else +            array_depth = 0; +        }        last = *p;        ++p; @@ -159,6 +167,10 @@ _dbus_validate_signature_with_reason (const DBusString *type_str,    if (dict_entry_depth > 0)      return DBUS_INVALID_DICT_ENTRY_STARTED_BUT_NOT_ENDED; + +  _dbus_assert (last != DBUS_TYPE_ARRAY); +  _dbus_assert (last != DBUS_STRUCT_BEGIN_CHAR); +  _dbus_assert (last != DBUS_DICT_ENTRY_BEGIN_CHAR);    return DBUS_VALID;  } @@ -362,6 +374,7 @@ validate_body_helper (DBusTypeReader       *reader,              DBusTypeReader sub;              DBusValidity validity;              int contained_alignment; +            int contained_type;              claimed_len = *p;              ++p; @@ -381,7 +394,11 @@ validate_body_helper (DBusTypeReader       *reader,                return DBUS_INVALID_VARIANT_SIGNATURE_MISSING_NUL;              ++p; -            contained_alignment = _dbus_type_get_alignment (_dbus_first_type_in_signature (&sig, 0)); +            contained_type = _dbus_first_type_in_signature (&sig, 0); +            if (contained_type == DBUS_TYPE_INVALID) +              return DBUS_INVALID_VARIANT_SIGNATURE_EMPTY; +             +            contained_alignment = _dbus_type_get_alignment (contained_type);              a = _DBUS_ALIGN_ADDRESS (p, contained_alignment);              if (a > end) @@ -395,8 +412,7 @@ validate_body_helper (DBusTypeReader       *reader,              _dbus_type_reader_init_types_only (&sub, &sig, 0); -            if (_dbus_type_reader_get_current_type (&sub) == DBUS_TYPE_INVALID) -              return DBUS_INVALID_VARIANT_SIGNATURE_EMPTY; +            _dbus_assert (_dbus_type_reader_get_current_type (&sub) != DBUS_TYPE_INVALID);              validity = validate_body_helper (&sub, byte_order, FALSE, p, end, &p);              if (validity != DBUS_VALID)  | 
