From db535b693afc25f9d42cbd9178b624b67f080297 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Tue, 11 Dec 2018 18:18:17 +0100 Subject: [PATCH] core: fix race creating secret-key Reading the secret key may result in generating and writing a new key to disk. Do that under the lock. (cherry picked from commit bc9f18c609b7aac84110b37ec280cb012364ecf4) --- src/nm-core-utils.c | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/src/nm-core-utils.c b/src/nm-core-utils.c index a379e405f9..c3d2e3c2a5 100644 --- a/src/nm-core-utils.c +++ b/src/nm-core-utils.c @@ -2872,7 +2872,7 @@ out: } typedef struct { - const guint8 *secret_key; + guint8 *secret_key; gsize key_len; bool is_good:1; } SecretKeyData; @@ -2887,19 +2887,14 @@ nm_utils_secret_key_get (const guint8 **out_secret_key, again: secret_key = g_atomic_pointer_get (&secret_key_static); if (G_UNLIKELY (!secret_key)) { - static gsize init_value = 0; static SecretKeyData secret_key_data; - gboolean tmp_success; - gs_free guint8 *tmp_secret_key = NULL; - gsize tmp_key_len; + static gsize init_value = 0; - tmp_success = _secret_key_read (&tmp_secret_key, &tmp_key_len); if (!g_once_init_enter (&init_value)) goto again; - secret_key_data.secret_key = g_steal_pointer (&tmp_secret_key); - secret_key_data.key_len = tmp_key_len; - secret_key_data.is_good = tmp_success; + secret_key_data.is_good = _secret_key_read (&secret_key_data.secret_key, + &secret_key_data.key_len); secret_key = &secret_key_data; g_atomic_pointer_set (&secret_key_static, secret_key); g_once_init_leave (&init_value, 1);