68 lines
1.9 KiB
Diff
68 lines
1.9 KiB
Diff
From 8c76bec77985be7f4c81a052ec649232341369f6 Mon Sep 17 00:00:00 2001
|
||
From: Philip Withnall <pwithnall@endlessos.org>
|
||
Date: Wed, 30 Sep 2020 16:16:11 +0100
|
||
Subject: [PATCH] gthread: Destroy value after replacing it in
|
||
g_private_replace()
|
||
MIME-Version: 1.0
|
||
Content-Type: text/plain; charset=UTF-8
|
||
Content-Transfer-Encoding: 8bit
|
||
|
||
If the old value is destroyed before updating the TLS value in pthreads
|
||
(or the Windows equivalent) then there’s a risk of infinite recursion if
|
||
`g_private_replace()` is called from within the `GDestroyNotify`.
|
||
|
||
Avoid that by destroying the old value after doing the TLS update.
|
||
|
||
Thanks to Matthias Clasen for diagnosing the issue.
|
||
|
||
Signed-off-by: Philip Withnall <pwithnall@endlessos.org>
|
||
|
||
Fixes: #2210
|
||
|
||
reason:gtestutils: Destroy value after replacing it in g_private_replace()
|
||
|
||
Conflict:NA
|
||
Reference:https://github.com/GNOME/glib/commit/8c76bec77985be7f4c81a052ec649232341369f6
|
||
---
|
||
glib/gthread-posix.c | 5 +++--
|
||
glib/gthread-win32.c | 2 +-
|
||
2 files changed, 4 insertions(+), 3 deletions(-)
|
||
|
||
diff --git a/glib/gthread-posix.c b/glib/gthread-posix.c
|
||
index f360559..f09f58a 100644
|
||
--- a/glib/gthread-posix.c
|
||
+++ b/glib/gthread-posix.c
|
||
@@ -1116,11 +1116,12 @@ g_private_replace (GPrivate *key,
|
||
gint status;
|
||
|
||
old = pthread_getspecific (*impl);
|
||
- if (old && key->notify)
|
||
- key->notify (old);
|
||
|
||
if G_UNLIKELY ((status = pthread_setspecific (*impl, value)) != 0)
|
||
g_thread_abort (status, "pthread_setspecific");
|
||
+
|
||
+ if (old && key->notify)
|
||
+ key->notify (old);
|
||
}
|
||
|
||
/* {{{1 GThread */
|
||
diff --git a/glib/gthread-win32.c b/glib/gthread-win32.c
|
||
index 54f74f2..0c37dc6 100644
|
||
--- a/glib/gthread-win32.c
|
||
+++ b/glib/gthread-win32.c
|
||
@@ -373,9 +373,9 @@ g_private_replace (GPrivate *key,
|
||
gpointer old;
|
||
|
||
old = TlsGetValue (impl);
|
||
+ TlsSetValue (impl, value);
|
||
if (old && key->notify)
|
||
key->notify (old);
|
||
- TlsSetValue (impl, value);
|
||
}
|
||
|
||
/* {{{1 GThread */
|
||
--
|
||
1.8.3.1
|
||
|