libnm: fix setting error for nm_connection_update_secrets()

By convention, a function that indicates failure *MUST* set
an error.

Also, an error can only be set once.
This commit is contained in:
Thomas Haller
2019-06-25 20:46:31 +02:00
parent d704f02119
commit 02a0967520
2 changed files with 23 additions and 10 deletions

View File

@@ -1866,7 +1866,8 @@ nm_connection_update_secrets (NMConnection *connection,
GError **error)
{
NMSetting *setting;
gboolean success = TRUE, updated = FALSE;
gboolean success = TRUE;
gboolean updated = FALSE;
GVariant *setting_dict = NULL;
GVariantIter iter;
const char *key;
@@ -1874,13 +1875,13 @@ nm_connection_update_secrets (NMConnection *connection,
int success_detail;
g_return_val_if_fail (NM_IS_CONNECTION (connection), FALSE);
g_return_val_if_fail ( g_variant_is_of_type (secrets, NM_VARIANT_TYPE_SETTING)
|| g_variant_is_of_type (secrets, NM_VARIANT_TYPE_CONNECTION), FALSE);
if (error)
g_return_val_if_fail (*error == NULL, FALSE);
full_connection = g_variant_is_of_type (secrets, NM_VARIANT_TYPE_CONNECTION);
g_return_val_if_fail (setting_name != NULL || full_connection, FALSE);
g_return_val_if_fail ( full_connection
|| g_variant_is_of_type (secrets, NM_VARIANT_TYPE_SETTING), FALSE);
g_return_val_if_fail (!error || !*error, FALSE);
g_return_val_if_fail (setting_name || full_connection, FALSE);
/* Empty @secrets means success */
if (g_variant_n_children (secrets) == 0)
@@ -1915,8 +1916,10 @@ nm_connection_update_secrets (NMConnection *connection,
g_clear_pointer (&setting_dict, g_variant_unref);
if (success_detail == NM_SETTING_UPDATE_SECRET_ERROR)
if (success_detail == NM_SETTING_UPDATE_SECRET_ERROR) {
nm_assert (!error || *error);
return FALSE;
}
if (success_detail == NM_SETTING_UPDATE_SECRET_SUCCESS_MODIFIED)
updated = TRUE;
} else {
@@ -1936,17 +1939,27 @@ nm_connection_update_secrets (NMConnection *connection,
/* Update each setting with any secrets from the connection dictionary */
g_variant_iter_init (&iter, secrets);
while (g_variant_iter_next (&iter, "{&s@a{sv}}", &key, &setting_dict)) {
gs_free_error GError *local = NULL;
/* Update the secrets for this setting */
setting = nm_connection_get_setting_by_name (connection, key);
g_signal_handlers_block_by_func (setting, (GCallback) setting_changed_cb, connection);
success_detail = _nm_setting_update_secrets (setting, setting_dict, error);
success_detail = _nm_setting_update_secrets (setting, setting_dict, error ? &local : NULL);
g_signal_handlers_unblock_by_func (setting, (GCallback) setting_changed_cb, connection);
g_variant_unref (setting_dict);
if (success_detail == NM_SETTING_UPDATE_SECRET_ERROR) {
success = FALSE;
if (success) {
if (error) {
nm_assert (local);
g_propagate_error (error, g_steal_pointer (&local));
error = NULL;
} else
nm_assert (!local);
success = FALSE;
}
break;
}
if (success_detail == NM_SETTING_UPDATE_SECRET_SUCCESS_MODIFIED)

View File

@@ -648,7 +648,7 @@ test_update_secrets_null_setting_name_with_setting_hash (void)
secrets = build_wep_secrets (wepkey);
NMTST_EXPECT_LIBNM_CRITICAL (NMTST_G_RETURN_MSG (setting_name != NULL || full_connection));
NMTST_EXPECT_LIBNM_CRITICAL (NMTST_G_RETURN_MSG (setting_name || full_connection));
success = nm_connection_update_secrets (connection, NULL, secrets, &error);
g_test_assert_expected_messages ();
g_assert_no_error (error);