summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Haller <thaller@redhat.com>2021-02-15 20:45:21 +0100
committerThomas Haller <thaller@redhat.com>2021-02-15 21:11:13 +0100
commitf9636080ace7d7834083dcb1a3300e08368ee4eb (patch)
treef18b3002a00a472aa586cb11478708262d258584
parentecdbb1ab8458b7a373038a2abd8cabd56e664ceb (diff)
downloadNetworkManager-f9636080ace7d7834083dcb1a3300e08368ee4eb.tar.gz
platform: reorder code in _netns_stack_get_impl()
We should always register the GArray stack with pthread for cleanup the thread local storage. Do that first, before creating the NMPNetns instance at the bottom of the stack.
-rw-r--r--shared/nm-platform/nmp-netns.c17
1 files changed, 9 insertions, 8 deletions
diff --git a/shared/nm-platform/nmp-netns.c b/shared/nm-platform/nmp-netns.c
index c7cb617b7e..0828f4abd6 100644
--- a/shared/nm-platform/nmp-netns.c
+++ b/shared/nm-platform/nmp-netns.c
@@ -158,9 +158,18 @@ _netns_stack_get_impl(void)
g_array_set_clear_func(s, _netns_stack_clear_cb);
_netns_stack = s;
+ /* register a destructor function to cleanup the array. If we fail
+ * to do so, we will leak NMPNetns instances (and their file descriptor) when the
+ * thread exits. */
+ if (pthread_key_create(&key, (void (*)(void *)) g_array_unref) != 0)
+ _LOGE(NULL, "failure to initialize thread-local storage");
+ else if (pthread_setspecific(key, s) != 0)
+ _LOGE(NULL, "failure to set thread-local storage");
+
/* at the bottom of the stack we must try to create a netns instance
* that we never pop. It's the base to which we need to return. */
netns = _netns_new(&error);
+
if (!netns) {
_LOGE(NULL, "failed to create initial netns: %s", error->message);
return s;
@@ -169,14 +178,6 @@ _netns_stack_get_impl(void)
/* we leak this instance inside the stack. */
_stack_push(s, netns, _CLONE_NS_ALL);
- /* finally, register a destructor function to cleanup the array. If we fail
- * to do so, we will leak NMPNetns instances (and their file descriptor) when the
- * thread exits. */
- if (pthread_key_create(&key, (void (*)(void *)) g_array_unref) != 0)
- _LOGE(NULL, "failure to initialize thread-local storage");
- else if (pthread_setspecific(key, s) != 0)
- _LOGE(NULL, "failure to set thread-local storage");
-
return s;
}