From a0db0834e281cb0d462298c09bb0aa691ac25bfc Mon Sep 17 00:00:00 2001 From: Simon McVittie Date: Mon, 23 Jul 2018 17:33:24 +0100 Subject: [PATCH 5/7] Add and use _dbus_list_clear_full In gcc 8, -Wall -Wextra includes -Wcast-function-type, which warns about passing an extra (unwanted) parameter to callbacks. Instead of using _dbus_list_foreach(), add a function to do what we actually wanted here. Signed-off-by: Simon McVittie --- bus/activation.c | 10 ++++------ bus/config-parser-trivial.c | 8 +------- bus/config-parser.c | 40 ++++++++----------------------------- dbus/dbus-connection.c | 18 +++++++---------- dbus/dbus-list.c | 27 +++++++++++++++++++++++++ dbus/dbus-list.h | 3 +++ dbus/dbus-message.c | 6 ++---- dbus/dbus-shell.c | 15 ++++---------- dbus/dbus-sysdeps.c | 3 +-- dbus/dbus-timeout.c | 6 ++---- dbus/dbus-watch.c | 7 +++---- 11 files changed, 62 insertions(+), 81 deletions(-) diff --git a/bus/activation.c b/bus/activation.c index 62058851..8f17711e 100644 --- a/bus/activation.c +++ b/bus/activation.c @@ -914,9 +914,8 @@ bus_activation_reload (BusActivation *activation, goto failed; } - _dbus_list_foreach (&activation->directories, - (DBusForeachFunction) bus_service_directory_unref, NULL); - _dbus_list_clear (&activation->directories); + _dbus_list_clear_full (&activation->directories, + (DBusFreeFunction) bus_service_directory_unref); link = _dbus_list_get_first_link (directories); while (link != NULL) @@ -1063,9 +1062,8 @@ bus_activation_unref (BusActivation *activation) if (activation->pending_activations) _dbus_hash_table_unref (activation->pending_activations); - _dbus_list_foreach (&activation->directories, - (DBusForeachFunction) bus_service_directory_unref, NULL); - _dbus_list_clear (&activation->directories); + _dbus_list_clear_full (&activation->directories, + (DBusFreeFunction) bus_service_directory_unref); if (activation->environment) _dbus_hash_table_unref (activation->environment); diff --git a/bus/config-parser-trivial.c b/bus/config-parser-trivial.c index 0351d20a..796c25e5 100644 --- a/bus/config-parser-trivial.c +++ b/bus/config-parser-trivial.c @@ -122,13 +122,7 @@ bus_config_parser_unref (BusConfigParser *parser) _dbus_string_free (&parser->user); _dbus_string_free (&parser->service_helper); _dbus_string_free (&parser->bus_type); - - _dbus_list_foreach (&parser->service_dirs, - (DBusForeachFunction) dbus_free, - NULL); - - _dbus_list_clear (&parser->service_dirs); - + _dbus_list_clear_full (&parser->service_dirs, dbus_free); dbus_free (parser); } diff --git a/bus/config-parser.c b/bus/config-parser.c index f49ab1dc..4343b512 100644 --- a/bus/config-parser.c +++ b/bus/config-parser.c @@ -585,31 +585,13 @@ bus_config_parser_unref (BusConfigParser *parser) dbus_free (parser->servicehelper); dbus_free (parser->bus_type); dbus_free (parser->pidfile); - - _dbus_list_foreach (&parser->listen_on, - (DBusForeachFunction) dbus_free, - NULL); - - _dbus_list_clear (&parser->listen_on); - - _dbus_list_foreach (&parser->service_dirs, - (DBusForeachFunction) bus_config_service_dir_free, - NULL); - - _dbus_list_clear (&parser->service_dirs); - _dbus_list_foreach (&parser->conf_dirs, - (DBusForeachFunction) dbus_free, - NULL); + _dbus_list_clear_full (&parser->listen_on, dbus_free); + _dbus_list_clear_full (&parser->service_dirs, + (DBusFreeFunction) bus_config_service_dir_free); + _dbus_list_clear_full (&parser->conf_dirs, dbus_free); + _dbus_list_clear_full (&parser->mechanisms, dbus_free); - _dbus_list_clear (&parser->conf_dirs); - - _dbus_list_foreach (&parser->mechanisms, - (DBusForeachFunction) dbus_free, - NULL); - - _dbus_list_clear (&parser->mechanisms); - _dbus_string_free (&parser->basedir); if (parser->policy) @@ -929,9 +911,7 @@ start_busconfig_child (BusConfigParser *parser, BUS_SERVICE_DIR_FLAGS_STRICT_NAMING)) { BUS_SET_OOM (error); - _dbus_list_foreach (&dirs, (DBusForeachFunction) dbus_free, - NULL); - _dbus_list_clear (&dirs); + _dbus_list_clear_full (&dirs, dbus_free); return FALSE; } } @@ -958,9 +938,7 @@ start_busconfig_child (BusConfigParser *parser, BUS_SERVICE_DIR_FLAGS_NONE)) { BUS_SET_OOM (error); - _dbus_list_foreach (&dirs, (DBusForeachFunction) dbus_free, - NULL); - _dbus_list_clear (&dirs); + _dbus_list_clear_full (&dirs, dbus_free); return FALSE; } @@ -996,9 +974,7 @@ start_busconfig_child (BusConfigParser *parser, BUS_SERVICE_DIR_FLAGS_NONE)) { BUS_SET_OOM (error); - _dbus_list_foreach (&dirs, (DBusForeachFunction) dbus_free, - NULL); - _dbus_list_clear (&dirs); + _dbus_list_clear_full (&dirs, dbus_free); return FALSE; } diff --git a/dbus/dbus-connection.c b/dbus/dbus-connection.c index b097cc6e..8a5829a8 100644 --- a/dbus/dbus-connection.c +++ b/dbus/dbus-connection.c @@ -2760,16 +2760,14 @@ _dbus_connection_last_unref (DBusConnection *connection) _dbus_hash_table_unref (connection->pending_replies); connection->pending_replies = NULL; - + _dbus_list_foreach (&connection->outgoing_messages, free_outgoing_message, connection); _dbus_list_clear (&connection->outgoing_messages); - - _dbus_list_foreach (&connection->incoming_messages, - (DBusForeachFunction) dbus_message_unref, - NULL); - _dbus_list_clear (&connection->incoming_messages); + + _dbus_list_clear_full (&connection->incoming_messages, + (DBusFreeFunction) dbus_message_unref); _dbus_counter_unref (connection->outgoing_counter); @@ -4709,11 +4707,9 @@ dbus_connection_dispatch (DBusConnection *connection) link = next; } - _dbus_list_foreach (&filter_list_copy, - (DBusForeachFunction)_dbus_message_filter_unref, - NULL); - _dbus_list_clear (&filter_list_copy); - + _dbus_list_clear_full (&filter_list_copy, + (DBusFreeFunction) _dbus_message_filter_unref); + CONNECTION_LOCK (connection); if (result == DBUS_HANDLER_RESULT_NEED_MEMORY) diff --git a/dbus/dbus-list.c b/dbus/dbus-list.c index aa556040..8104aa5e 100644 --- a/dbus/dbus-list.c +++ b/dbus/dbus-list.c @@ -557,6 +557,33 @@ _dbus_list_clear (DBusList **list) *list = NULL; } +/** + * Free every link and every element in the list. + * + * @param list address of the head of the list. + * @param function free-function to call for each element. + * + */ +void +_dbus_list_clear_full (DBusList **list, + DBusFreeFunction function) +{ + DBusList *link; + + link = *list; + while (link != NULL) + { + DBusList *next = _dbus_list_get_next_link (list, link); + + function (link->data); + free_link (link); + + link = next; + } + + *list = NULL; +} + /** * Gets the first link in the list. * This is a constant-time operation. diff --git a/dbus/dbus-list.h b/dbus/dbus-list.h index 9350a0da..57a72eb8 100644 --- a/dbus/dbus-list.h +++ b/dbus/dbus-list.h @@ -73,6 +73,9 @@ DBusList* _dbus_list_find_last (DBusList **list, DBUS_PRIVATE_EXPORT void _dbus_list_clear (DBusList **list); DBUS_PRIVATE_EXPORT +void _dbus_list_clear_full (DBusList **list, + DBusFreeFunction function); +DBUS_PRIVATE_EXPORT DBusList* _dbus_list_get_first_link (DBusList **list); DBUS_PRIVATE_EXPORT DBusList* _dbus_list_get_last_link (DBusList **list); diff --git a/dbus/dbus-message.c b/dbus/dbus-message.c index d9e5bb90..e43c4b3a 100644 --- a/dbus/dbus-message.c +++ b/dbus/dbus-message.c @@ -4218,10 +4218,8 @@ _dbus_message_loader_unref (DBusMessageLoader *loader) close_unix_fds(loader->unix_fds, &loader->n_unix_fds); dbus_free(loader->unix_fds); #endif - _dbus_list_foreach (&loader->messages, - (DBusForeachFunction) dbus_message_unref, - NULL); - _dbus_list_clear (&loader->messages); + _dbus_list_clear_full (&loader->messages, + (DBusFreeFunction) dbus_message_unref); _dbus_string_free (&loader->data); dbus_free (loader); } diff --git a/dbus/dbus-shell.c b/dbus/dbus-shell.c index 44cbbcf3..fb00523f 100644 --- a/dbus/dbus-shell.c +++ b/dbus/dbus-shell.c @@ -523,12 +523,7 @@ tokenize_command_line (const char *command_line, DBusError *error) _dbus_string_free (¤t_token); init_error: - if (retval) - { - _dbus_list_foreach (&retval, (DBusForeachFunction) dbus_free, NULL); - _dbus_list_clear (&retval); - } - + _dbus_list_clear_full (&retval, dbus_free); return NULL; } @@ -618,9 +613,8 @@ _dbus_shell_parse_argv (const char *command_line, ++i; } argv[argc] = NULL; - - _dbus_list_foreach (&tokens, (DBusForeachFunction) dbus_free, NULL); - _dbus_list_clear (&tokens); + + _dbus_list_clear_full (&tokens, dbus_free); if (argcp) *argcp = argc; @@ -633,8 +627,7 @@ _dbus_shell_parse_argv (const char *command_line, return TRUE; error: - _dbus_list_foreach (&tokens, (DBusForeachFunction) dbus_free, NULL); - _dbus_list_clear (&tokens); + _dbus_list_clear_full (&tokens, dbus_free); return FALSE; diff --git a/dbus/dbus-sysdeps.c b/dbus/dbus-sysdeps.c index d9fd13a9..72496e05 100644 --- a/dbus/dbus-sysdeps.c +++ b/dbus/dbus-sysdeps.c @@ -341,8 +341,7 @@ _dbus_split_paths_and_append (DBusString *dirs, return TRUE; oom: - _dbus_list_foreach (dir_list, (DBusForeachFunction)dbus_free, NULL); - _dbus_list_clear (dir_list); + _dbus_list_clear_full (dir_list, dbus_free); return FALSE; } diff --git a/dbus/dbus-timeout.c b/dbus/dbus-timeout.c index 23ca6e44..4c658464 100644 --- a/dbus/dbus-timeout.c +++ b/dbus/dbus-timeout.c @@ -218,10 +218,8 @@ _dbus_timeout_list_free (DBusTimeoutList *timeout_list) _dbus_timeout_list_set_functions (timeout_list, NULL, NULL, NULL, NULL, NULL); - _dbus_list_foreach (&timeout_list->timeouts, - (DBusForeachFunction) _dbus_timeout_unref, - NULL); - _dbus_list_clear (&timeout_list->timeouts); + _dbus_list_clear_full (&timeout_list->timeouts, + (DBusFreeFunction) _dbus_timeout_unref); dbus_free (timeout_list); } diff --git a/dbus/dbus-watch.c b/dbus/dbus-watch.c index 98422968..78376efc 100644 --- a/dbus/dbus-watch.c +++ b/dbus/dbus-watch.c @@ -251,10 +251,9 @@ _dbus_watch_list_free (DBusWatchList *watch_list) /* free watch_data and removes watches as a side effect */ _dbus_watch_list_set_functions (watch_list, NULL, NULL, NULL, NULL, NULL); - _dbus_list_foreach (&watch_list->watches, - (DBusForeachFunction) _dbus_watch_unref, - NULL); - _dbus_list_clear (&watch_list->watches); + + _dbus_list_clear_full (&watch_list->watches, + (DBusFreeFunction) _dbus_watch_unref); dbus_free (watch_list); } -- 2.18.0