diff options
Diffstat (limited to 'dbus/dbus-marshal-validate.c')
| -rw-r--r-- | dbus/dbus-marshal-validate.c | 33 | 
1 files changed, 32 insertions, 1 deletions
diff --git a/dbus/dbus-marshal-validate.c b/dbus/dbus-marshal-validate.c index b26adb2c..e57be5c7 100644 --- a/dbus/dbus-marshal-validate.c +++ b/dbus/dbus-marshal-validate.c @@ -40,6 +40,10 @@   * The range passed in should NOT include the terminating   * nul/DBUS_TYPE_INVALID.   * + * @todo verify that dict entries have exactly two fields + *  + * @todo require that dict entries are in an array + *   * @param type_str the string   * @param type_pos where the typecodes start   * @param len length of typecodes @@ -55,6 +59,7 @@ _dbus_validate_signature_with_reason (const DBusString *type_str,    int last;    int struct_depth;    int array_depth; +  int dict_entry_depth;    _dbus_assert (type_str != NULL);    _dbus_assert (type_pos < _DBUS_INT32_MAX - len); @@ -68,6 +73,7 @@ _dbus_validate_signature_with_reason (const DBusString *type_str,    end = _dbus_string_get_const_data_len (type_str, type_pos + len, 0);    struct_depth = 0;    array_depth = 0; +  dict_entry_depth = 0;    last = DBUS_TYPE_INVALID;    while (p != end) @@ -112,7 +118,28 @@ _dbus_validate_signature_with_reason (const DBusString *type_str,            struct_depth -= 1;            break; -        case DBUS_TYPE_STRUCT: /* doesn't appear in signatures */ +        case DBUS_DICT_ENTRY_BEGIN_CHAR: +          if (last != DBUS_TYPE_ARRAY) +            return DBUS_INVALID_DICT_ENTRY_NOT_INSIDE_ARRAY; +           +          dict_entry_depth += 1; + +          if (dict_entry_depth > DBUS_MAXIMUM_TYPE_RECURSION_DEPTH) +            return DBUS_INVALID_EXCEEDED_MAXIMUM_DICT_ENTRY_RECURSION; +          break; + +        case DBUS_DICT_ENTRY_END_CHAR: +          if (dict_entry_depth == 0) +            return DBUS_INVALID_DICT_ENTRY_ENDED_BUT_NOT_STARTED; +           +          if (last == DBUS_DICT_ENTRY_BEGIN_CHAR) +            return DBUS_INVALID_DICT_ENTRY_HAS_NO_FIELDS; + +          dict_entry_depth -= 1; +          break; +           +        case DBUS_TYPE_STRUCT:     /* doesn't appear in signatures */ +        case DBUS_TYPE_DICT_ENTRY: /* ditto */          default:            return DBUS_INVALID_UNKNOWN_TYPECODE;          } @@ -130,6 +157,9 @@ _dbus_validate_signature_with_reason (const DBusString *type_str,    if (struct_depth > 0)      return DBUS_INVALID_STRUCT_STARTED_BUT_NOT_ENDED; +  if (dict_entry_depth > 0) +    return DBUS_INVALID_DICT_ENTRY_STARTED_BUT_NOT_ENDED; +      return DBUS_VALID;  } @@ -377,6 +407,7 @@ validate_body_helper (DBusTypeReader       *reader,            }            break; +        case DBUS_TYPE_DICT_ENTRY:          case DBUS_TYPE_STRUCT:            {              DBusTypeReader sub;  | 
