diff options
author | Thomas Haller <thaller@redhat.com> | 2021-02-15 20:45:21 +0100 |
---|---|---|
committer | Thomas Haller <thaller@redhat.com> | 2021-02-15 21:11:13 +0100 |
commit | f9636080ace7d7834083dcb1a3300e08368ee4eb (patch) | |
tree | f18b3002a00a472aa586cb11478708262d258584 | |
parent | ecdbb1ab8458b7a373038a2abd8cabd56e664ceb (diff) | |
download | NetworkManager-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.c | 17 |
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; } |