diff options
Diffstat (limited to 'meta/recipes-core/glibc/glibc/0027-Acquire-ld.so-lock-before-switching-to-malloc_atfork.patch')
-rw-r--r-- | meta/recipes-core/glibc/glibc/0027-Acquire-ld.so-lock-before-switching-to-malloc_atfork.patch | 30 |
1 files changed, 14 insertions, 16 deletions
diff --git a/meta/recipes-core/glibc/glibc/0027-Acquire-ld.so-lock-before-switching-to-malloc_atfork.patch b/meta/recipes-core/glibc/glibc/0027-Acquire-ld.so-lock-before-switching-to-malloc_atfork.patch index 9ec234bd51..1ad14b7fc3 100644 --- a/meta/recipes-core/glibc/glibc/0027-Acquire-ld.so-lock-before-switching-to-malloc_atfork.patch +++ b/meta/recipes-core/glibc/glibc/0027-Acquire-ld.so-lock-before-switching-to-malloc_atfork.patch | |||
@@ -1,7 +1,7 @@ | |||
1 | From 94225ab4bcc1613531558a632270b5edce779bc9 Mon Sep 17 00:00:00 2001 | 1 | From c3e04a90dd762cad4ee9bd7564d74e052781be5c Mon Sep 17 00:00:00 2001 |
2 | From: Khem Raj <raj.khem@gmail.com> | 2 | From: Khem Raj <raj.khem@gmail.com> |
3 | Date: Sat, 27 Jan 2018 10:08:04 -0800 | 3 | Date: Sat, 27 Jan 2018 10:08:04 -0800 |
4 | Subject: [PATCH 27/27] Acquire ld.so lock before switching to malloc_atfork | 4 | Subject: [PATCH 27/30] Acquire ld.so lock before switching to malloc_atfork |
5 | 5 | ||
6 | The patch is from | 6 | The patch is from |
7 | https://sourceware.org/bugzilla/show_bug.cgi?id=4578 | 7 | https://sourceware.org/bugzilla/show_bug.cgi?id=4578 |
@@ -28,11 +28,11 @@ Signed-off-by: Yuanjie Huang <yuanjie.huang@windriver.com> | |||
28 | Signed-off-by: Zhixiong Chi <zhixiong.chi@windriver.com> | 28 | Signed-off-by: Zhixiong Chi <zhixiong.chi@windriver.com> |
29 | Signed-off-by: Khem Raj <raj.khem@gmail.com> | 29 | Signed-off-by: Khem Raj <raj.khem@gmail.com> |
30 | --- | 30 | --- |
31 | sysdeps/nptl/fork.c | 9 +++++++++ | 31 | sysdeps/nptl/fork.c | 7 +++++++ |
32 | 1 file changed, 9 insertions(+) | 32 | 1 file changed, 7 insertions(+) |
33 | 33 | ||
34 | diff --git a/sysdeps/nptl/fork.c b/sysdeps/nptl/fork.c | 34 | diff --git a/sysdeps/nptl/fork.c b/sysdeps/nptl/fork.c |
35 | index f87506f398..225e7b51f8 100644 | 35 | index 0f48933ff1..eef3f9669b 100644 |
36 | --- a/sysdeps/nptl/fork.c | 36 | --- a/sysdeps/nptl/fork.c |
37 | +++ b/sysdeps/nptl/fork.c | 37 | +++ b/sysdeps/nptl/fork.c |
38 | @@ -25,6 +25,7 @@ | 38 | @@ -25,6 +25,7 @@ |
@@ -43,22 +43,20 @@ index f87506f398..225e7b51f8 100644 | |||
43 | #include <stdio-lock.h> | 43 | #include <stdio-lock.h> |
44 | #include <atomic.h> | 44 | #include <atomic.h> |
45 | #include <nptl/pthreadP.h> | 45 | #include <nptl/pthreadP.h> |
46 | @@ -60,6 +61,10 @@ __libc_fork (void) | 46 | @@ -56,6 +57,9 @@ __libc_fork (void) |
47 | but our current fork implementation is not. */ | ||
48 | bool multiple_threads = THREAD_GETMEM (THREAD_SELF, header.multiple_threads); | 47 | bool multiple_threads = THREAD_GETMEM (THREAD_SELF, header.multiple_threads); |
49 | 48 | ||
49 | __run_fork_handlers (atfork_run_prepare); | ||
50 | + /* grab ld.so lock BEFORE switching to malloc_atfork */ | 50 | + /* grab ld.so lock BEFORE switching to malloc_atfork */ |
51 | + __rtld_lock_lock_recursive (GL(dl_load_lock)); | 51 | + __rtld_lock_lock_recursive (GL(dl_load_lock)); |
52 | + __rtld_lock_lock_recursive (GL(dl_load_write_lock)); | 52 | + __rtld_lock_lock_recursive (GL(dl_load_write_lock)); |
53 | + | ||
54 | /* Run all the registered preparation handlers. In reverse order. | ||
55 | While doing this we build up a list of all the entries. */ | ||
56 | struct fork_handler *runp; | ||
57 | @@ -246,6 +251,10 @@ __libc_fork (void) | ||
58 | 53 | ||
59 | allp = allp->next; | 54 | /* If we are not running multiple threads, we do not have to |
60 | } | 55 | preserve lock state. If fork runs from a signal handler, only |
61 | + | 56 | @@ -150,6 +154,9 @@ __libc_fork (void) |
57 | |||
58 | /* Run the handlers registered for the parent. */ | ||
59 | __run_fork_handlers (atfork_run_parent); | ||
62 | + /* unlock ld.so last, because we locked it first */ | 60 | + /* unlock ld.so last, because we locked it first */ |
63 | + __rtld_lock_unlock_recursive (GL(dl_load_write_lock)); | 61 | + __rtld_lock_unlock_recursive (GL(dl_load_write_lock)); |
64 | + __rtld_lock_unlock_recursive (GL(dl_load_lock)); | 62 | + __rtld_lock_unlock_recursive (GL(dl_load_lock)); |
@@ -66,5 +64,5 @@ index f87506f398..225e7b51f8 100644 | |||
66 | 64 | ||
67 | return pid; | 65 | return pid; |
68 | -- | 66 | -- |
69 | 2.16.1 | 67 | 2.18.0 |
70 | 68 | ||