diff options
| -rw-r--r-- | ChangeLog | 14 | ||||
| -rw-r--r-- | bus/desktop-file.c | 13 | ||||
| -rw-r--r-- | bus/dispatch.c | 31 | ||||
| -rw-r--r-- | dbus/dbus-memory.c | 29 | ||||
| -rw-r--r-- | dbus/dbus-threads.c | 2 | 
5 files changed, 57 insertions, 32 deletions
@@ -1,3 +1,17 @@ +2006-10-23  David Zeuthen  <davidz@redhat.com> + +	* dbus/dbus-memory.c: Use atomic variable to protect +	n_blocks_outstanding otherwise OOM will be reported using SMP on +	some arches +	 +	* bus/dispatch.c: Add missing end of line characters + +	* bus/desktop-file.c (parse_section_start, parse_key_value)  +	(bus_desktop_file_load): Propertly handle OOM + +	* dbus/dbus-threads.c (init_uninitialized_locks): Check that +	thread_init_generation equals _dbus_current_generation, not 0 +  2006-10-22  Havoc Pennington  <hp@redhat.com>  	* dbus/dbus-connection-internal.h: move prototype of diff --git a/bus/desktop-file.c b/bus/desktop-file.c index 407044c9..d798bb12 100644 --- a/bus/desktop-file.c +++ b/bus/desktop-file.c @@ -430,6 +430,8 @@ parse_section_start (BusDesktopFileParser *parser, DBusError *error)    if (open_section (parser, section_name) == NULL)      {        dbus_free (section_name); +      parser_free (parser); +      BUS_SET_OOM (error);        return FALSE;      } @@ -527,6 +529,7 @@ parse_key_value (BusDesktopFileParser *parser, DBusError *error)      {        dbus_free (value);        parser_free (parser); +      BUS_SET_OOM (error);        return FALSE;      } @@ -534,21 +537,26 @@ parse_key_value (BusDesktopFileParser *parser, DBusError *error)      {        dbus_free (value);        parser_free (parser); +      BUS_SET_OOM (error);        return FALSE;      }    if (!_dbus_string_copy_len (&parser->data, key_start, key_end - key_start,                                &key, 0))      { +      _dbus_string_free (&key);        dbus_free (value);        parser_free (parser); +      BUS_SET_OOM (error);        return FALSE;      }    if (!_dbus_string_steal_data (&key, &tmp))      { +      _dbus_string_free (&key);        dbus_free (value);        parser_free (parser); +      BUS_SET_OOM (error);        return FALSE;      } @@ -633,7 +641,10 @@ bus_desktop_file_load (DBusString *filename,      }    if (!_dbus_string_init (&str)) -    return NULL; +    { +      BUS_SET_OOM (error); +      return NULL; +    }    if (!_dbus_file_get_contents (&str, filename, error))      { diff --git a/bus/dispatch.c b/bus/dispatch.c index d374f75a..185d7f81 100644 --- a/bus/dispatch.c +++ b/bus/dispatch.c @@ -581,7 +581,7 @@ check_service_owner_changed_foreach (DBusConnection *connection,            || (d->expected_kind == OWNER_CHANGED   && (!old_owner[0] || !new_owner[0]))            || (d->expected_kind == SERVICE_DELETED && (!old_owner[0] ||  new_owner[0])))          { -          _dbus_warn ("inconsistent NameOwnerChanged arguments"); +          _dbus_warn ("inconsistent NameOwnerChanged arguments\n");            goto out;          } @@ -2359,7 +2359,7 @@ check_got_service_info (DBusMessage *message)              }            else              { -              _dbus_warn ("unexpected arguments for NameOwnerChanged message"); +              _dbus_warn ("unexpected arguments for NameOwnerChanged message\n");                message_kind = GOT_SOMETHING_ELSE;              }          } @@ -2556,12 +2556,13 @@ check_existent_service_no_auto_start (BusContext     *context,              if (message_kind != GOT_ERROR)                {                  block_connection_until_message_from_bus (context, connection, "error about service exiting"); -               +		                  /* and process everything again */                  bus_test_run_everything (context);                  if (!check_got_error (context, connection,                                        DBUS_ERROR_SPAWN_CHILD_EXITED, +				      DBUS_ERROR_NO_MEMORY,                                        NULL))                    goto out;                } @@ -3109,7 +3110,7 @@ check_existent_service_auto_start (BusContext     *context,        if (message == NULL)          {            _dbus_warn ("No message after auto activation " -                      "(should be a service announcement)"); +                      "(should be a service announcement)\n");            dbus_connection_return_message (connection, message);            message = NULL;            goto out; @@ -3398,7 +3399,7 @@ check_shell_service_success_auto_start (BusContext     *context,        if (message == NULL)          {            _dbus_warn ("No message after auto activation " -                      "(should be a service announcement)"); +                      "(should be a service announcement)\n");            dbus_connection_return_message (connection, message);            message = NULL;            goto out; @@ -3489,7 +3490,7 @@ check_shell_service_success_auto_start (BusContext     *context,                                         DBUS_TYPE_STRING, &argv[6],                                         DBUS_TYPE_INVALID))      { -      _dbus_warn ("Error getting arguments from return"); +      _dbus_warn ("Error getting arguments from return\n");        goto out;      } @@ -3498,42 +3499,42 @@ check_shell_service_success_auto_start (BusContext     *context,     */    if (strcmp("-test", argv[1]) != 0)      { -      _dbus_warn ("Unexpected argv[1] in shell success service test (expected: %s, got: %s)",  +      _dbus_warn ("Unexpected argv[1] in shell success service test (expected: %s, got: %s)\n",                     "-test", argv[1]);        goto out;      }     if (strcmp("that", argv[2]) != 0)      { -      _dbus_warn ("Unexpected argv[2] in shell success service test (expected: %s, got: %s)",  +      _dbus_warn ("Unexpected argv[2] in shell success service test (expected: %s, got: %s)\n",                      "that", argv[2]);        goto out;      }     if (strcmp("we get", argv[3]) != 0)      { -      _dbus_warn ("Unexpected argv[3] in shell success service test (expected: %s, got: %s)",  +      _dbus_warn ("Unexpected argv[3] in shell success service test (expected: %s, got: %s)\n",                      "we get", argv[3]);        goto out;      }     if (strcmp("back", argv[4]) != 0)      { -      _dbus_warn ("Unexpected argv[4] in shell success service test (expected: %s, got: %s)",  +      _dbus_warn ("Unexpected argv[4] in shell success service test (expected: %s, got: %s)\n",                      "back", argv[4]);        goto out;      }     if (strcmp("--what", argv[5]) != 0)      { -      _dbus_warn ("Unexpected argv[5] in shell success service test (expected: %s, got: %s)",  +      _dbus_warn ("Unexpected argv[5] in shell success service test (expected: %s, got: %s)\n",                      "--what", argv[5]);        goto out;      }     if (strcmp("we put in", argv[6]) != 0)      { -      _dbus_warn ("Unexpected argv[6] in shell success service test (expected: %s, got: %s)",  +      _dbus_warn ("Unexpected argv[6] in shell success service test (expected: %s, got: %s)\n",                      "we put in", argv[6]);        goto out;      }  @@ -3880,7 +3881,7 @@ check_list_services (BusContext     *context,  	case GOT_ERROR:  	case GOT_SERVICE_DELETED:  	  _dbus_warn ("Unexpected message after ActivateService " -		      "(should be an error or a service announcement"); +		      "(should be an error or a service announcement)\n");  	  goto out;  	case GOT_SERVICE_CREATED: @@ -3955,7 +3956,7 @@ check_oom_check2_func (void *data)    if (!check_no_leftovers (d->context))      { -      _dbus_warn ("Messages were left over, should be covered by test suite"); +      _dbus_warn ("Messages were left over, should be covered by test suite\n");        return FALSE;      } @@ -4057,7 +4058,7 @@ bus_dispatch_test (const DBusString *test_data_dir)    if (!check_no_leftovers (context))      { -      _dbus_warn ("Messages were left over after setting up initial connections"); +      _dbus_warn ("Messages were left over after setting up initial connections\n");        _dbus_assert_not_reached ("initial connection setup failed");      } diff --git a/dbus/dbus-memory.c b/dbus/dbus-memory.c index f2400af7..a240b2cc 100644 --- a/dbus/dbus-memory.c +++ b/dbus/dbus-memory.c @@ -105,7 +105,7 @@ static int n_failures_this_failure = 0;  static dbus_bool_t guards = FALSE;  static dbus_bool_t disable_mem_pools = FALSE;  static dbus_bool_t backtrace_on_fail_alloc = FALSE; -static int n_blocks_outstanding = 0; +static DBusAtomic n_blocks_outstanding = {0};  /** value stored in guard padding for debugging buffer overrun */  #define GUARD_VALUE 0xdeadbeef @@ -283,7 +283,7 @@ _dbus_decrement_fail_alloc_counter (void)  int  _dbus_get_malloc_blocks_outstanding (void)  { -  return n_blocks_outstanding; +  return n_blocks_outstanding.value;  }  /** @@ -445,11 +445,10 @@ dbus_malloc (size_t bytes)    if (_dbus_decrement_fail_alloc_counter ())      {        _dbus_verbose (" FAILING malloc of %ld bytes\n", (long) bytes); -              return NULL;      }  #endif -   +    if (bytes == 0) /* some system mallocs handle this, some don't */      return NULL;  #ifdef DBUS_BUILD_TESTS @@ -461,7 +460,7 @@ dbus_malloc (size_t bytes)        block = malloc (bytes + GUARD_EXTRA_SIZE);        if (block) -        n_blocks_outstanding += 1; +	_dbus_atomic_inc (&n_blocks_outstanding);        return set_guards (block, bytes, SOURCE_MALLOC);      } @@ -472,7 +471,7 @@ dbus_malloc (size_t bytes)        mem = malloc (bytes);  #ifdef DBUS_BUILD_TESTS        if (mem) -        n_blocks_outstanding += 1; +	_dbus_atomic_inc (&n_blocks_outstanding);  #endif        return mem;      } @@ -503,7 +502,7 @@ dbus_malloc0 (size_t bytes)        return NULL;      }  #endif - +      if (bytes == 0)      return NULL;  #ifdef DBUS_BUILD_TESTS @@ -515,7 +514,7 @@ dbus_malloc0 (size_t bytes)        block = calloc (bytes + GUARD_EXTRA_SIZE, 1);        if (block) -        n_blocks_outstanding += 1; +	_dbus_atomic_inc (&n_blocks_outstanding);        return set_guards (block, bytes, SOURCE_MALLOC_ZERO);      }  #endif @@ -525,7 +524,7 @@ dbus_malloc0 (size_t bytes)        mem = calloc (bytes, 1);  #ifdef DBUS_BUILD_TESTS        if (mem) -        n_blocks_outstanding += 1; +	_dbus_atomic_inc (&n_blocks_outstanding);  #endif        return mem;      } @@ -590,7 +589,7 @@ dbus_realloc (void  *memory,            block = malloc (bytes + GUARD_EXTRA_SIZE);            if (block) -            n_blocks_outstanding += 1; +	    _dbus_atomic_inc (&n_blocks_outstanding);            return set_guards (block, bytes, SOURCE_REALLOC_NULL);             } @@ -602,7 +601,7 @@ dbus_realloc (void  *memory,        mem = realloc (memory, bytes);  #ifdef DBUS_BUILD_TESTS        if (memory == NULL && mem != NULL) -        n_blocks_outstanding += 1; +	    _dbus_atomic_inc (&n_blocks_outstanding);  #endif        return mem;      } @@ -623,9 +622,9 @@ dbus_free (void  *memory)        check_guards (memory, TRUE);        if (memory)          { -          n_blocks_outstanding -= 1; +	  _dbus_atomic_dec (&n_blocks_outstanding); -          _dbus_assert (n_blocks_outstanding >= 0); +	  _dbus_assert (n_blocks_outstanding.value >= 0);            free (((unsigned char*)memory) - GUARD_START_OFFSET);          } @@ -637,9 +636,9 @@ dbus_free (void  *memory)    if (memory) /* we guarantee it's safe to free (NULL) */      {  #ifdef DBUS_BUILD_TESTS -      n_blocks_outstanding -= 1; +      _dbus_atomic_dec (&n_blocks_outstanding); -      _dbus_assert (n_blocks_outstanding >= 0); +      _dbus_assert (n_blocks_outstanding.value >= 0);  #endif        free (memory); diff --git a/dbus/dbus-threads.c b/dbus/dbus-threads.c index 1fbf48b6..a1f3357b 100644 --- a/dbus/dbus-threads.c +++ b/dbus/dbus-threads.c @@ -350,7 +350,7 @@ init_uninitialized_locks (void)  {    DBusList *link; -  _dbus_assert (thread_init_generation == 0); +  _dbus_assert (thread_init_generation == _dbus_current_generation);    link = uninitialized_mutex_list;    while (link != NULL)  | 
