diff options
| author | Havoc Pennington <hp@redhat.com> | 2003-10-12 00:55:11 +0000 | 
|---|---|---|
| committer | Havoc Pennington <hp@redhat.com> | 2003-10-12 00:55:11 +0000 | 
| commit | 56cc4ae1a241d36b64dbe26de89714f7771f6e78 (patch) | |
| tree | b0180844a5d5ead62328f02071936a111ebf32d5 | |
| parent | a4d928b7a0e9619e0cc7d69e7eec427cec1dc725 (diff) | |
2003-10-11  Havoc Pennington  <hp@pobox.com>
	* test/decode-gcov.c (function_solve_graph): make broken block
	graph a nonfatal error since it seems to be broken. Need to debug
	this.
	* dbus/dbus-marshal.c (_dbus_type_is_valid): new function since we
	can't just check type > INVALID < LAST anymore
	* dbus/dbus-message.c (dbus_message_get_signature): new function
	(dbus_message_has_signature): new function
	(struct DBusMessage): add signature field (right now it isn't sent
	over the wire, just generated on the fly)
	(dbus_message_copy): copy the signature, and init strings to
	proper length to avoid some reallocs
	(dbus_message_iter_init_array_iterator): return void, since it
	can't fail
	(dbus_message_iter_init_dict_iterator): return void since it can't fail
	(_dbus_message_loader_queue_messages): add silly temporary hack to
	fill in message->signature on load
	* dbus/dbus-protocol.h: change DBUS_TYPE_* values to be ASCII
	characters, so they are relatively human-readable.
| -rw-r--r-- | ChangeLog | 24 | ||||
| -rw-r--r-- | dbus/dbus-marshal.c | 31 | ||||
| -rw-r--r-- | dbus/dbus-marshal.h | 1 | ||||
| -rw-r--r-- | dbus/dbus-message.c | 279 | ||||
| -rw-r--r-- | dbus/dbus-message.h | 7 | ||||
| -rw-r--r-- | dbus/dbus-protocol.h | 32 | ||||
| -rw-r--r-- | doc/TODO | 14 | ||||
| -rw-r--r-- | test/break-loader.c | 31 | ||||
| -rw-r--r-- | test/decode-gcov.c | 4 | 
9 files changed, 343 insertions, 80 deletions
@@ -1,5 +1,29 @@  2003-10-11  Havoc Pennington  <hp@pobox.com> +	* test/decode-gcov.c (function_solve_graph): make broken block +	graph a nonfatal error since it seems to be broken. Need to debug +	this. + +	* dbus/dbus-marshal.c (_dbus_type_is_valid): new function since we +	can't just check type > INVALID < LAST anymore + +	* dbus/dbus-message.c (dbus_message_get_signature): new function +	(dbus_message_has_signature): new function +	(struct DBusMessage): add signature field (right now it isn't sent +	over the wire, just generated on the fly) +	(dbus_message_copy): copy the signature, and init strings to +	proper length to avoid some reallocs +	(dbus_message_iter_init_array_iterator): return void, since it +	can't fail +	(dbus_message_iter_init_dict_iterator): return void since it can't fail +	(_dbus_message_loader_queue_messages): add silly temporary hack to +	fill in message->signature on load + +	* dbus/dbus-protocol.h: change DBUS_TYPE_* values to be ASCII +	characters, so they are relatively human-readable. + +2003-10-11  Havoc Pennington  <hp@pobox.com> +  	* dbus/dbus-message.c (_dbus_message_test): add more test  	coverage, but #if 0 for now since they uncover a bug   	not fixed yet; I think in re_align_field_recurse() diff --git a/dbus/dbus-marshal.c b/dbus/dbus-marshal.c index cb989891..1e4992ad 100644 --- a/dbus/dbus-marshal.c +++ b/dbus/dbus-marshal.c @@ -1801,7 +1801,7 @@ _dbus_marshal_validate_type   (const DBusString *str,    data = _dbus_string_get_const_data_len (str, pos, 1); -  if (*data > DBUS_TYPE_INVALID && *data <= DBUS_TYPE_LAST) +  if (_dbus_type_is_valid (*data))      {        *type = *data;        if (end_pos != NULL) @@ -2207,6 +2207,35 @@ _dbus_marshal_validate_arg (const DBusString *str,    return TRUE;  } +/** + * Return #TRUE if the typecode is a valid typecode + * + * @returns #TRUE if valid + */ +dbus_bool_t +_dbus_type_is_valid (int typecode) +{ +  switch (typecode) +    { +    case DBUS_TYPE_NIL: +    case DBUS_TYPE_BYTE: +    case DBUS_TYPE_BOOLEAN: +    case DBUS_TYPE_INT32: +    case DBUS_TYPE_UINT32: +    case DBUS_TYPE_INT64: +    case DBUS_TYPE_UINT64: +    case DBUS_TYPE_DOUBLE: +    case DBUS_TYPE_STRING: +    case DBUS_TYPE_NAMED: +    case DBUS_TYPE_ARRAY: +    case DBUS_TYPE_DICT: +    case DBUS_TYPE_OBJECT_PATH: +      return TRUE; +       +    default: +      return FALSE; +    } +}  /**   * If in verbose mode, print a block of binary data. diff --git a/dbus/dbus-marshal.h b/dbus/dbus-marshal.h index 27ded007..0e482c17 100644 --- a/dbus/dbus-marshal.h +++ b/dbus/dbus-marshal.h @@ -313,5 +313,6 @@ dbus_bool_t _dbus_marshal_validate_arg    (const DBusString *str,                                             int               pos,                                             int              *end_pos); +dbus_bool_t _dbus_type_is_valid           (int               typecode);  #endif /* DBUS_PROTOCOL_H */ diff --git a/dbus/dbus-message.c b/dbus/dbus-message.c index 18a9b50f..e23e56e1 100644 --- a/dbus/dbus-message.c +++ b/dbus/dbus-message.c @@ -103,7 +103,9 @@ struct DBusMessage    unsigned int locked : 1; /**< Message being sent, no modifications allowed. */ -  DBusDataSlotList slot_list;   /**< Data stored by allocated integer ID */   +  DBusDataSlotList slot_list;   /**< Data stored by allocated integer ID */ + +  DBusString signature; /**< Signature */  };  enum { @@ -1102,6 +1104,14 @@ dbus_message_new_empty_header (void)        dbus_free (message);        return NULL;      } + +  if (!_dbus_string_init_preallocated (&message->signature, 4)) +    { +      _dbus_string_free (&message->header); +      _dbus_string_free (&message->body); +      dbus_free (message); +      return NULL; +    }    return message;  } @@ -1349,45 +1359,56 @@ dbus_message_copy (const DBusMessage *message)    retval->header_padding = message->header_padding;    retval->locked = FALSE; -  if (!_dbus_string_init (&retval->header)) +  if (!_dbus_string_init_preallocated (&retval->header, +                                       _dbus_string_get_length (&message->header)))      {        dbus_free (retval);        return NULL;      } -  if (!_dbus_string_init (&retval->body)) +  if (!_dbus_string_init_preallocated (&retval->body, +                                       _dbus_string_get_length (&message->body)))      {        _dbus_string_free (&retval->header);        dbus_free (retval);        return NULL;      } -  if (!_dbus_string_copy (&message->header, 0, -			  &retval->header, 0)) +  if (!_dbus_string_init_preallocated (&retval->signature, +                                       _dbus_string_get_length (&message->signature)))      {        _dbus_string_free (&retval->header);        _dbus_string_free (&retval->body);        dbus_free (retval); -        return NULL;      } +   +  if (!_dbus_string_copy (&message->header, 0, +			  &retval->header, 0)) +    goto failed_copy;    if (!_dbus_string_copy (&message->body, 0,  			  &retval->body, 0)) -    { -      _dbus_string_free (&retval->header); -      _dbus_string_free (&retval->body); -      dbus_free (retval); - -      return NULL; -    } +    goto failed_copy; +  if (!_dbus_string_copy (&message->signature, 0, +			  &retval->signature, 0)) +    goto failed_copy; +      for (i = 0; i <= DBUS_HEADER_FIELD_LAST; i++)      {        retval->header_fields[i] = message->header_fields[i];      }    return retval; + + failed_copy: +  _dbus_string_free (&retval->header); +  _dbus_string_free (&retval->body); +  _dbus_string_free (&retval->signature); +  dbus_free (retval); +   +  return NULL;    } @@ -1448,6 +1469,7 @@ dbus_message_unref (DBusMessage *message)        _dbus_string_free (&message->header);        _dbus_string_free (&message->body); +      _dbus_string_free (&message->signature);        dbus_free (message);      } @@ -2371,6 +2393,9 @@ skip_array_type (DBusMessageRealIter *iter, int pos)    return pos;  } +/* FIXME what are these _dbus_type_is_valid() checks for? + * haven't we validated the message? + */  static int  dbus_message_iter_get_data_start (DBusMessageRealIter *iter, int *type)  { @@ -2382,7 +2407,7 @@ dbus_message_iter_get_data_start (DBusMessageRealIter *iter, int *type)      case DBUS_MESSAGE_ITER_TYPE_MESSAGE:        data = _dbus_string_get_const_data_len (&iter->message->body,  					      iter->pos, 1); -      if (*data > DBUS_TYPE_INVALID && *data <= DBUS_TYPE_LAST) +      if (_dbus_type_is_valid (*data))  	*type = *data;        else  	*type = DBUS_TYPE_INVALID; @@ -2392,7 +2417,7 @@ dbus_message_iter_get_data_start (DBusMessageRealIter *iter, int *type)      case DBUS_MESSAGE_ITER_TYPE_ARRAY:        data = _dbus_string_get_const_data_len (&iter->message->body,  					      iter->array_type_pos, 1); -      if (*data > DBUS_TYPE_INVALID && *data <= DBUS_TYPE_LAST) +      if (_dbus_type_is_valid (*data))  	*type = *data;        else  	*type = DBUS_TYPE_INVALID; @@ -2408,7 +2433,7 @@ dbus_message_iter_get_data_start (DBusMessageRealIter *iter, int *type)        data = _dbus_string_get_const_data_len (&iter->message->body,  					      pos, 1); -      if (*data > DBUS_TYPE_INVALID && *data <= DBUS_TYPE_LAST) +      if (_dbus_type_is_valid (*data))  	*type = *data;        else  	*type = DBUS_TYPE_INVALID; @@ -2509,6 +2534,9 @@ dbus_message_iter_get_arg_type (DBusMessageIter *iter)    return type;  } +/* FIXME why do we validate the typecode in here, hasn't the message + * already been verified? + */  static int  iter_get_array_type (DBusMessageRealIter *iter, int *array_type_pos)  { @@ -2544,7 +2572,7 @@ iter_get_array_type (DBusMessageRealIter *iter, int *array_type_pos)    data = _dbus_string_get_const_data_len (&iter->message->body,  					  _array_type_pos, 1); -  if (*data > DBUS_TYPE_INVALID && *data <= DBUS_TYPE_LAST) +  if (_dbus_type_is_valid (*data))      return  *data;    return DBUS_TYPE_INVALID; @@ -2851,9 +2879,8 @@ dbus_message_iter_get_double (DBusMessageIter *iter)   * @param iter the iterator   * @param array_iter pointer to an iterator to initialize   * @param array_type gets set to the type of the array elements - * @returns #TRUE on success   */ -dbus_bool_t +void  dbus_message_iter_init_array_iterator (DBusMessageIter *iter,  				       DBusMessageIter *array_iter,  				       int             *array_type) @@ -2863,7 +2890,7 @@ dbus_message_iter_init_array_iterator (DBusMessageIter *iter,    int type, pos, len_pos, len, array_type_pos;    int _array_type; -  _dbus_return_val_if_fail (dbus_message_iter_check (real), FALSE); +  _dbus_return_if_fail (dbus_message_iter_check (real));    pos = dbus_message_iter_get_data_start (real, &type); @@ -2891,8 +2918,6 @@ dbus_message_iter_init_array_iterator (DBusMessageIter *iter,    if (array_type != NULL)      *array_type = _array_type; -   -  return TRUE;  } @@ -2903,9 +2928,8 @@ dbus_message_iter_init_array_iterator (DBusMessageIter *iter,   *   * @param iter the iterator   * @param dict_iter pointer to an iterator to initialize - * @returns #TRUE on success   */ -dbus_bool_t +void  dbus_message_iter_init_dict_iterator (DBusMessageIter *iter,  				      DBusMessageIter *dict_iter)  { @@ -2913,7 +2937,7 @@ dbus_message_iter_init_dict_iterator (DBusMessageIter *iter,    DBusMessageRealIter *dict_real = (DBusMessageRealIter *)dict_iter;    int type, pos, len_pos, len; -  _dbus_return_val_if_fail (dbus_message_iter_check (real), FALSE); +  _dbus_return_if_fail (dbus_message_iter_check (real));    pos = dbus_message_iter_get_data_start (real, &type); @@ -2934,8 +2958,6 @@ dbus_message_iter_init_dict_iterator (DBusMessageIter *iter,    dict_real->container_start = pos;    dict_real->container_length_pos = len_pos;    dict_real->wrote_dict_key = 0; - -  return TRUE;  }  /** @@ -3324,8 +3346,14 @@ dbus_message_iter_append_type (DBusMessageRealIter *iter,    switch (iter->type)      {      case DBUS_MESSAGE_ITER_TYPE_MESSAGE: +      if (!_dbus_string_append_byte (&iter->message->signature, type)) +        return FALSE; +              if (!_dbus_string_append_byte (&iter->message->body, type)) -	return FALSE; +        { +          _dbus_string_shorten (&iter->message->signature, 1); +          return FALSE; +        }        break;      case DBUS_MESSAGE_ITER_TYPE_ARRAY: @@ -3346,7 +3374,7 @@ dbus_message_iter_append_type (DBusMessageRealIter *iter,  	}        if (!_dbus_string_append_byte (&iter->message->body, type)) -	return FALSE; +        return FALSE;        break; @@ -3783,10 +3811,18 @@ append_array_type (DBusMessageRealIter *real,      {        if (array_type_pos != NULL)  	*array_type_pos = _dbus_string_get_length (&real->message->body); + + +      if (!_dbus_string_append_byte (&real->message->signature, element_type)) +        { +          _dbus_string_set_length (&real->message->body, real->pos); +          return FALSE; +        }        /* Append element type */        if (!_dbus_string_append_byte (&real->message->body, element_type))  	{ +          _dbus_string_shorten (&real->message->signature, 1);  	  _dbus_string_set_length (&real->message->body, real->pos);  	  return FALSE;  	} @@ -3796,7 +3832,10 @@ append_array_type (DBusMessageRealIter *real,        if (element_type != DBUS_TYPE_ARRAY &&  	  !array_iter_type_mark_done (real)) -	return FALSE; +        { +          _dbus_string_shorten (&real->message->signature, 1); +          return FALSE; +        }              }    return TRUE; @@ -3881,10 +3920,10 @@ dbus_message_iter_append_dict (DBusMessageIter      *iter,    int len_pos;    _dbus_return_val_if_fail (dbus_message_iter_append_check (real), FALSE); - +      if (!dbus_message_iter_append_type (real, DBUS_TYPE_DICT)) -    return FALSE; - +    return FALSE;   +      len_pos = _DBUS_ALIGN_VALUE (_dbus_string_get_length (&real->message->body), sizeof (dbus_uint32_t));    /* Empty length for now, backfill later */ @@ -4258,6 +4297,29 @@ dbus_message_get_sender (DBusMessage *message)  			   NULL);  } +/** + * Gets the type signature of the message, i.e. the arguments in the + * message payload. The signature includes only "in" arguments for + * #DBUS_MESSAGE_TYPE_METHOD_CALL and only "out" arguments for + * #DBUS_MESSAGE_TYPE_METHOD_RETURN, so is slightly different from + * what you might expect (it does not include the signature of the + * entire C++-style method). + * + * The signature is a string made up of type codes such + * as #DBUS_TYPE_STRING. The string is terminated with nul + * (nul is also the value of #DBUS_TYPE_INVALID). + *  + * @param message the message + * @returns the type signature + */ +const char* +dbus_message_get_signature (DBusMessage *message) +{ +  _dbus_return_val_if_fail (message != NULL, NULL); +   +  return _dbus_string_get_const_data (&message->signature); +} +  static dbus_bool_t  _dbus_message_has_type_interface_member (DBusMessage *message,                                           int          type, @@ -4419,7 +4481,8 @@ dbus_message_has_sender (DBusMessage  *message,  {    const char *s; -  _dbus_assert (service != NULL); +  _dbus_return_val_if_fail (message != NULL, FALSE); +  _dbus_return_val_if_fail (service != NULL, FALSE);    s = dbus_message_get_sender (message); @@ -4430,6 +4493,25 @@ dbus_message_has_sender (DBusMessage  *message,  }  /** + * Checks whether the message has the given signature; + * see dbus_message_get_signature() for more details on + * what the signature looks like. + * + * @param message the message + * @param signature typecode array + * @returns #TRUE if message has the given signature +*/ +dbus_bool_t +dbus_message_has_signature (DBusMessage   *message, +                            const char    *signature) +{ +  _dbus_return_val_if_fail (message != NULL, FALSE); +  _dbus_return_val_if_fail (signature != NULL, FALSE); + +  return _dbus_string_equal_c_str (&message->signature, signature); +} + +/**   * Sets a #DBusError based on the contents of the given   * message. The error is only set if the message   * is an error message, as in DBUS_MESSAGE_TYPE_ERROR. @@ -5198,6 +5280,60 @@ _dbus_message_loader_queue_messages (DBusMessageLoader *loader)  							   message->byte_order,  							   CLIENT_SERIAL_OFFSET,  							   NULL); + +          /* Fill in signature (FIXME should do this during validation, +           * but I didn't want to spend time on it since we want to change +           * the wire format to contain the signature anyway) +           */ +          { +            DBusMessageIter iter; + +            dbus_message_iter_init (message, &iter); + +            do +              { +                int t; + +                t = dbus_message_iter_get_arg_type (&iter); +                if (t == DBUS_TYPE_INVALID) +                  break; + +                if (!_dbus_string_append_byte (&message->signature, +                                               t)) +                  { +                    _dbus_verbose ("failed to append type byte to signature\n"); +                    _dbus_list_remove_last (&loader->messages, message); +                    dbus_message_unref (message); +                    return FALSE; +                  } + +                if (t == DBUS_TYPE_ARRAY) +                  { +                    DBusMessageIter child_iter; +                    int array_type = t; + +                    child_iter = iter; +                     +                    while (array_type == DBUS_TYPE_ARRAY) +                      { +                        DBusMessageIter parent_iter = child_iter; +                        dbus_message_iter_init_array_iterator (&parent_iter, +                                                               &child_iter, +                                                               &array_type); +                                             +                        if (!_dbus_string_append_byte (&message->signature, +                                                       array_type)) +                          { +                            _dbus_verbose ("failed to append array type byte to signature\n"); +                            _dbus_list_remove_last (&loader->messages, message); +                            dbus_message_unref (message); +                            return FALSE; +                          } +                      } +                  } +              } +            while (dbus_message_iter_next (&iter)); +          }  	  _dbus_verbose ("Loaded message %p\n", message);  	} @@ -5512,8 +5648,7 @@ message_iter_test (DBusMessage *message)      _dbus_assert_not_reached ("Array type not double"); -  if (!dbus_message_iter_init_array_iterator (&iter, &array, NULL)) -    _dbus_assert_not_reached ("Array init failed"); +  dbus_message_iter_init_array_iterator (&iter, &array, NULL);    if (dbus_message_iter_get_arg_type (&array) != DBUS_TYPE_DOUBLE)      _dbus_assert_not_reached ("Argument type isn't double"); @@ -5542,8 +5677,7 @@ message_iter_test (DBusMessage *message)    if (dbus_message_iter_get_arg_type (&iter) != DBUS_TYPE_DICT)      _dbus_assert_not_reached ("not dict type"); -  if (!dbus_message_iter_init_dict_iterator (&iter, &dict)) -    _dbus_assert_not_reached ("dict iter failed"); +  dbus_message_iter_init_dict_iterator (&iter, &dict);    str = dbus_message_iter_get_dict_key (&dict);    if (str == NULL || strcmp (str, "test") != 0) @@ -5572,8 +5706,7 @@ message_iter_test (DBusMessage *message)    if (dbus_message_iter_get_array_type (&dict) != DBUS_TYPE_ARRAY)      _dbus_assert_not_reached ("Array type not array"); -  if (!dbus_message_iter_init_array_iterator (&dict, &array, NULL)) -    _dbus_assert_not_reached ("Array init failed"); +  dbus_message_iter_init_array_iterator (&dict, &array, NULL);    if (dbus_message_iter_get_arg_type (&array) != DBUS_TYPE_ARRAY)      _dbus_assert_not_reached ("Argument type isn't array"); @@ -5581,8 +5714,7 @@ message_iter_test (DBusMessage *message)    if (dbus_message_iter_get_array_type (&array) != DBUS_TYPE_INT32)      _dbus_assert_not_reached ("Array type not int32"); -  if (!dbus_message_iter_init_array_iterator (&array, &array2, NULL)) -    _dbus_assert_not_reached ("Array init failed"); +  dbus_message_iter_init_array_iterator (&array, &array2, NULL);    if (dbus_message_iter_get_arg_type (&array2) != DBUS_TYPE_INT32)      _dbus_assert_not_reached ("Argument type isn't int32"); @@ -5727,11 +5859,7 @@ check_message_handling_type (DBusMessageIter *iter,        {  	int array_type; -	if (!dbus_message_iter_init_array_iterator (iter, &child_iter, &array_type)) -	  { -	    _dbus_warn ("Failed to init array iterator\n"); -	    return FALSE; -	  } +	dbus_message_iter_init_array_iterator (iter, &child_iter, &array_type);  	while (dbus_message_iter_has_next (&child_iter))  	  { @@ -5751,11 +5879,7 @@ check_message_handling_type (DBusMessageIter *iter,  	int entry_type;  	char *key; -	if (!dbus_message_iter_init_dict_iterator (iter, &child_iter)) -	  { -	    _dbus_warn ("Failed to init dict iterator\n"); -	    return FALSE; -	  } +	dbus_message_iter_init_dict_iterator (iter, &child_iter);  	while ((entry_type = dbus_message_iter_get_arg_type (&child_iter)) != DBUS_TYPE_INVALID)  	  { @@ -6479,8 +6603,7 @@ verify_test_message (DBusMessage *message)    if (dbus_message_iter_get_arg_type (&iter) != DBUS_TYPE_DICT)      _dbus_assert_not_reached ("not dict type"); -  if (!dbus_message_iter_init_dict_iterator (&iter, &dict)) -    _dbus_assert_not_reached ("dict iter failed"); +  dbus_message_iter_init_dict_iterator (&iter, &dict);    our_str = dbus_message_iter_get_dict_key (&dict);    if (our_str == NULL || strcmp (our_str, "test") != 0) @@ -6546,6 +6669,8 @@ _dbus_message_test (const char *test_data_dir)    const double our_double_array[] = { 0.1234, 9876.54321, -300.0 };    const unsigned char our_byte_array[] = { 'a', 'b', 'c', 234 };    const unsigned char our_boolean_array[] = { TRUE, FALSE, TRUE, TRUE, FALSE }; +  char sig[64]; +  const char *s;    _dbus_assert (sizeof (DBusMessageRealIter) <= sizeof (DBusMessageIter)); @@ -6671,12 +6796,53 @@ _dbus_message_test (const char *test_data_dir)    dbus_message_iter_append_dict_key (&child_iter, "test");    dbus_message_iter_append_uint32 (&child_iter, 0xDEADBEEF);    dbus_message_iter_append_uint32 (&iter, 0xCAFEBABE); + +  i = 0; +  sig[i++] = DBUS_TYPE_INT32; +#ifdef DBUS_HAVE_INT64 +  sig[i++] = DBUS_TYPE_INT64; +  sig[i++] = DBUS_TYPE_UINT64; +#endif +  sig[i++] = DBUS_TYPE_STRING; +  sig[i++] = DBUS_TYPE_DOUBLE; +  sig[i++] = DBUS_TYPE_BOOLEAN; +  sig[i++] = DBUS_TYPE_ARRAY; +  sig[i++] = DBUS_TYPE_UINT32; +  sig[i++] = DBUS_TYPE_ARRAY; +  sig[i++] = DBUS_TYPE_INT32; +#ifdef DBUS_HAVE_INT64 +  sig[i++] = DBUS_TYPE_ARRAY; +  sig[i++] = DBUS_TYPE_UINT64; +  sig[i++] = DBUS_TYPE_ARRAY; +  sig[i++] = DBUS_TYPE_INT64; +#endif +  sig[i++] = DBUS_TYPE_ARRAY; +  sig[i++] = DBUS_TYPE_STRING; +  sig[i++] = DBUS_TYPE_ARRAY; +  sig[i++] = DBUS_TYPE_DOUBLE; +  sig[i++] = DBUS_TYPE_ARRAY; +  sig[i++] = DBUS_TYPE_BYTE; +  sig[i++] = DBUS_TYPE_ARRAY; +  sig[i++] = DBUS_TYPE_BOOLEAN; +  sig[i++] = DBUS_TYPE_DICT; +  sig[i++] = DBUS_TYPE_UINT32; +  sig[i++] = DBUS_TYPE_INVALID; + +  _dbus_assert (i < (int) _DBUS_N_ELEMENTS (sig));    _dbus_verbose_bytes_of_string (&message->header, 0,                                   _dbus_string_get_length (&message->header));    _dbus_verbose_bytes_of_string (&message->body, 0,                                   _dbus_string_get_length (&message->body)); - +   +  _dbus_verbose ("Signature expected \"%s\" actual \"%s\"\n", +                 sig, dbus_message_get_signature (message)); +   +  s = dbus_message_get_signature (message); +   +  _dbus_assert (dbus_message_has_signature (message, sig)); +  _dbus_assert (strcmp (s, sig) == 0); +      verify_test_message (message);    copy = dbus_message_copy (message); @@ -6691,6 +6857,9 @@ _dbus_message_test (const char *test_data_dir)    _dbus_assert (_dbus_string_get_length (&message->body) ==                  _dbus_string_get_length (©->body)); +  _dbus_assert (_dbus_string_get_length (&message->signature) == +                _dbus_string_get_length (©->signature)); +      verify_test_message (copy);    name1 = dbus_message_get_interface (message); diff --git a/dbus/dbus-message.h b/dbus/dbus-message.h index bfaf2f0d..235bec6d 100644 --- a/dbus/dbus-message.h +++ b/dbus/dbus-message.h @@ -96,6 +96,7 @@ const char*   dbus_message_get_destination  (DBusMessage   *message);  dbus_bool_t   dbus_message_set_sender       (DBusMessage   *message,                                               const char    *sender);  const char*   dbus_message_get_sender       (DBusMessage   *message); +const char*   dbus_message_get_signature    (DBusMessage   *message);  void          dbus_message_set_no_reply     (DBusMessage   *message,                                               dbus_bool_t    no_reply);  dbus_bool_t   dbus_message_get_no_reply     (DBusMessage   *message); @@ -111,6 +112,8 @@ dbus_bool_t   dbus_message_has_destination  (DBusMessage   *message,                                               const char    *service);  dbus_bool_t   dbus_message_has_sender       (DBusMessage   *message,                                               const char    *service); +dbus_bool_t   dbus_message_has_signature    (DBusMessage   *message, +                                             const char    *signature);  dbus_uint32_t dbus_message_get_serial       (DBusMessage   *message);  dbus_bool_t   dbus_message_set_reply_serial (DBusMessage   *message,                                               dbus_uint32_t  reply_serial); @@ -166,10 +169,10 @@ dbus_bool_t   dbus_message_iter_get_named      (DBusMessageIter  *iter,  						unsigned char   **value,  						int              *len); -dbus_bool_t dbus_message_iter_init_array_iterator (DBusMessageIter   *iter, +void        dbus_message_iter_init_array_iterator (DBusMessageIter   *iter,  						   DBusMessageIter   *array_iter,  						   int               *array_type); -dbus_bool_t dbus_message_iter_init_dict_iterator  (DBusMessageIter   *iter, +void        dbus_message_iter_init_dict_iterator  (DBusMessageIter   *iter,  						   DBusMessageIter   *dict_iter);  dbus_bool_t dbus_message_iter_get_byte_array      (DBusMessageIter   *iter,  						   unsigned char    **value, diff --git a/dbus/dbus-protocol.h b/dbus/dbus-protocol.h index 549ef0e5..94bb4dd9 100644 --- a/dbus/dbus-protocol.h +++ b/dbus/dbus-protocol.h @@ -40,22 +40,22 @@ extern "C" {  #define DBUS_MAJOR_PROTOCOL_VERSION 0  /* Data types */ -#define DBUS_TYPE_INVALID       0 -#define DBUS_TYPE_NIL           1 -#define DBUS_TYPE_BYTE          2 -#define DBUS_TYPE_BOOLEAN       3 -#define DBUS_TYPE_INT32         4 -#define DBUS_TYPE_UINT32        5 -#define DBUS_TYPE_INT64         6 -#define DBUS_TYPE_UINT64        7 -#define DBUS_TYPE_DOUBLE        8 -#define DBUS_TYPE_STRING        9 -#define DBUS_TYPE_NAMED         10 -#define DBUS_TYPE_ARRAY         11 -#define DBUS_TYPE_DICT          12 -#define DBUS_TYPE_OBJECT_PATH   13 -   -#define DBUS_TYPE_LAST DBUS_TYPE_OBJECT_PATH +#define DBUS_TYPE_INVALID       ((int) '\0') +#define DBUS_TYPE_NIL           ((int) 'v') +#define DBUS_TYPE_BYTE          ((int) 'y') +#define DBUS_TYPE_BOOLEAN       ((int) 'b') +#define DBUS_TYPE_INT32         ((int) 'i') +#define DBUS_TYPE_UINT32        ((int) 'u') +#define DBUS_TYPE_INT64         ((int) 'x') +#define DBUS_TYPE_UINT64        ((int) 't') +#define DBUS_TYPE_DOUBLE        ((int) 'd') +#define DBUS_TYPE_STRING        ((int) 's') +#define DBUS_TYPE_NAMED         ((int) 'n') +#define DBUS_TYPE_ARRAY         ((int) 'a') +#define DBUS_TYPE_DICT          ((int) 'c') +#define DBUS_TYPE_OBJECT_PATH   ((int) 'o') + +#define DBUS_NUMBER_OF_TYPES    (13)  /* Max length in bytes of a service or interface or member name */  #define DBUS_MAXIMUM_NAME_LENGTH 256 @@ -93,3 +93,17 @@   - re_align_field_recurse() in dbus-message.c is broken because it      crashes on some types of header field values. security problem. + + - the system daemon has to be able to reload changes to the  +   security policy without restarting, because apps won't  +   be coded to handle it restarting + + - modify the wire protocol to keep the args signature separate  +   from the args themselves. Make the name of TYPE_NAMED part  +   of the type signature, rather than part of the value. +   Then you have the full typecheck in a single string. + + - rename TYPE_NAMED to TYPE_CUSTOM, probably a clearer name. + + - dbus_message_iter_init_array_iterator has "iter" and "iterator"  +   in the same function name diff --git a/test/break-loader.c b/test/break-loader.c index 3771d7cc..5a0c61f2 100644 --- a/test/break-loader.c +++ b/test/break-loader.c @@ -392,6 +392,31 @@ randomly_set_extreme_ints (const DBusString *orig_data,                              extreme_ints[which]);  } +static int +random_type (void) +{ +  const char types[] = { +    DBUS_TYPE_INVALID, +    DBUS_TYPE_NIL, +    DBUS_TYPE_BYTE, +    DBUS_TYPE_BOOLEAN, +    DBUS_TYPE_INT32, +    DBUS_TYPE_UINT32, +    DBUS_TYPE_INT64, +    DBUS_TYPE_UINT64, +    DBUS_TYPE_DOUBLE, +    DBUS_TYPE_STRING, +    DBUS_TYPE_NAMED, +    DBUS_TYPE_ARRAY, +    DBUS_TYPE_DICT, +    DBUS_TYPE_OBJECT_PATH +  }; + +  _dbus_assert (_DBUS_N_ELEMENTS (types) == DBUS_NUMBER_OF_TYPES + 1); + +  return types[ random_int_in_range (0, _DBUS_N_ELEMENTS (types)) ]; +} +  static void  randomly_change_one_type (const DBusString *orig_data,                            DBusString       *mutated) @@ -420,11 +445,9 @@ randomly_change_one_type (const DBusString *orig_data,      {        int b;        b = _dbus_string_get_byte (mutated, i); -      if (b > DBUS_TYPE_INVALID && b <= DBUS_TYPE_LAST) +      if (_dbus_type_is_valid (b))          { -          _dbus_string_set_byte (mutated, i, -                                 random_int_in_range (DBUS_TYPE_INVALID, -                                                      DBUS_TYPE_LAST + 1)); +          _dbus_string_set_byte (mutated, i, random_type ());            return;          }        ++i; diff --git a/test/decode-gcov.c b/test/decode-gcov.c index 29f061f7..9eb8d7be 100644 --- a/test/decode-gcov.c +++ b/test/decode-gcov.c @@ -831,10 +831,10 @@ function_solve_graph (Function *func)      {        if (block_graph[i].succ_count || block_graph[i].pred_count)          { -          fprintf (stderr, "Block graph solved incorrectly\n"); +          fprintf (stderr, "WARNING: Block graph solved incorrectly\n");            fprintf (stderr, " block %d has succ_count = %d pred_count = %d\n",                     i, (int) block_graph[i].succ_count, (int) block_graph[i].pred_count); -          exit (1); +          fprintf (stderr, " this error reflects a bug in decode-gcov.c\n");          }      }  }  | 
