about summary refs log tree commit diff
path: root/debian/patches/platform-reorder-code-in-_netns_stack_get_impl.patch
diff options
context:
space:
mode:
Diffstat (limited to 'debian/patches/platform-reorder-code-in-_netns_stack_get_impl.patch')
-rw-r--r--debian/patches/platform-reorder-code-in-_netns_stack_get_impl.patch51
1 files changed, 51 insertions, 0 deletions
diff --git a/debian/patches/platform-reorder-code-in-_netns_stack_get_impl.patch b/debian/patches/platform-reorder-code-in-_netns_stack_get_impl.patch
new file mode 100644
index 00000000..d68983af
--- /dev/null
+++ b/debian/patches/platform-reorder-code-in-_netns_stack_get_impl.patch
@@ -0,0 +1,51 @@
+From: Thomas Haller <thaller@redhat.com>
+Date: Mon, 15 Feb 2021 20:45:21 +0100
+Subject: 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.
+
+(cherry picked from commit f9636080ace7d7834083dcb1a3300e08368ee4eb)
+---
+ shared/nm-platform/nmp-netns.c | 17 +++++++++--------
+ 1 file changed, 9 insertions(+), 8 deletions(-)
+
+diff --git a/shared/nm-platform/nmp-netns.c b/shared/nm-platform/nmp-netns.c
+index c7cb617..0828f4a 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;
+ }
+