forked from pool/libcap
- update to 2.44:
Generally, this is a release to help package builders: no functional change to any of the generated code just documentation and make related fixes. OBS-URL: https://build.opensuse.org/package/show/Base:System/libcap?expand=0&rev=46
This commit is contained in:
parent
a5d442790b
commit
80cf1e65e7
@ -1,114 +0,0 @@
|
|||||||
From 7cfe15ee579ea83a7780c6190576fdcab3e2faac Mon Sep 17 00:00:00 2001
|
|
||||||
From: "Andrew G. Morgan" <morgan@kernel.org>
|
|
||||||
Date: Wed, 11 Nov 2020 19:53:06 -0800
|
|
||||||
Subject: [PATCH] Allow a dying thread to participate in the psx mechanism.
|
|
||||||
|
|
||||||
If a dying thread blocks all interrupts in order to die in peace,
|
|
||||||
it can deadlock the psx mechanism for all the surviving threads.
|
|
||||||
To account for this corner case, while waiting to enter the
|
|
||||||
_PSX_EXITING state, temporarily unblock the psx_tracker.psx_sig.
|
|
||||||
|
|
||||||
https://github.com/golang/go/issues/42494
|
|
||||||
|
|
||||||
Add a psx_test.go:TestThreadChurn() test case for this issue.
|
|
||||||
|
|
||||||
Signed-off-by: Andrew G. Morgan <morgan@kernel.org>
|
|
||||||
---
|
|
||||||
psx/psx.c | 34 ++++++++++++++++++++++++++++++++++
|
|
||||||
psx/psx_test.go | 33 +++++++++++++++++++++++++++++++++
|
|
||||||
2 files changed, 67 insertions(+)
|
|
||||||
|
|
||||||
diff --git a/psx/psx.c b/psx/psx.c
|
|
||||||
index 72c2098..233267d 100644
|
|
||||||
--- a/psx/psx.c
|
|
||||||
+++ b/psx/psx.c
|
|
||||||
@@ -336,11 +336,45 @@ typedef struct {
|
|
||||||
* https://sourceware.org/bugzilla/show_bug.cgi?id=12889
|
|
||||||
*/
|
|
||||||
static void _psx_exiting(void *node) {
|
|
||||||
+ /*
|
|
||||||
+ * Until we are in the _PSX_EXITING state, we must not block the
|
|
||||||
+ * psx_sig interrupt for this dying thread. That is, until this
|
|
||||||
+ * exiting thread can set ref->gone to 1, this dying thread is
|
|
||||||
+ * still participating in the psx syscall distribution.
|
|
||||||
+ *
|
|
||||||
+ * See https://github.com/golang/go/issues/42494 for a situation
|
|
||||||
+ * where this code is called with psx_tracker.psx_sig blocked.
|
|
||||||
+ */
|
|
||||||
+ sigset_t sigbit, orig_sigbits;
|
|
||||||
+ sigemptyset(&sigbit);
|
|
||||||
+ pthread_sigmask(SIG_UNBLOCK, &sigbit, &orig_sigbits);
|
|
||||||
+ sigaddset(&sigbit, psx_tracker.psx_sig);
|
|
||||||
+ pthread_sigmask(SIG_UNBLOCK, &sigbit, NULL);
|
|
||||||
+
|
|
||||||
+ /*
|
|
||||||
+ * With psx_tracker.psx_sig unblocked we can wait until this
|
|
||||||
+ * thread can enter the _PSX_EXITING state.
|
|
||||||
+ */
|
|
||||||
psx_new_state(_PSX_IDLE, _PSX_EXITING);
|
|
||||||
+
|
|
||||||
+ /*
|
|
||||||
+ * We now indicate that this thread is no longer participating in
|
|
||||||
+ * the psx mechanism.
|
|
||||||
+ */
|
|
||||||
registered_thread_t *ref = node;
|
|
||||||
pthread_mutex_lock(&ref->mu);
|
|
||||||
ref->gone = 1;
|
|
||||||
pthread_mutex_unlock(&ref->mu);
|
|
||||||
+
|
|
||||||
+ /*
|
|
||||||
+ * At this point, we can restore the calling sigmask to whatever
|
|
||||||
+ * the caller thought was appropriate for a dying thread to have.
|
|
||||||
+ */
|
|
||||||
+ pthread_sigmask(SIG_SETMASK, &orig_sigbits, NULL);
|
|
||||||
+
|
|
||||||
+ /*
|
|
||||||
+ * Allow the rest of the psx system carry on as per normal.
|
|
||||||
+ */
|
|
||||||
psx_new_state(_PSX_EXITING, _PSX_IDLE);
|
|
||||||
}
|
|
||||||
|
|
||||||
diff --git a/psx/psx_test.go b/psx/psx_test.go
|
|
||||||
index ae6ccd2..3f0445c 100644
|
|
||||||
--- a/psx/psx_test.go
|
|
||||||
+++ b/psx/psx_test.go
|
|
||||||
@@ -64,3 +64,36 @@ func TestErrno(t *testing.T) {
|
|
||||||
t.Errorf("psx changes prevailing errno got=%v(%d) want=%v", syscall.Errno(v), v, syscall.EPERM)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
+
|
|
||||||
+// killAThread locks the goroutine to a thread and exits. This has the
|
|
||||||
+// effect of making the go runtime terminate the thread.
|
|
||||||
+func killAThread(c <-chan struct{}) {
|
|
||||||
+ runtime.LockOSThread()
|
|
||||||
+ <-c
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+// Test to confirm no regression against:
|
|
||||||
+//
|
|
||||||
+// https://github.com/golang/go/issues/42494
|
|
||||||
+func TestThreadChurn(t *testing.T) {
|
|
||||||
+ const prSetKeepCaps = 8
|
|
||||||
+
|
|
||||||
+ for j := 0; j < 4; j++ {
|
|
||||||
+ kill := (j & 1) != 0
|
|
||||||
+ sysc := (j & 2) != 0
|
|
||||||
+ t.Logf("[%d] testing kill=%v, sysc=%v", j, kill, sysc)
|
|
||||||
+ for i := 50; i > 0; i-- {
|
|
||||||
+ if kill {
|
|
||||||
+ c := make(chan struct{})
|
|
||||||
+ go killAThread(c)
|
|
||||||
+ close(c)
|
|
||||||
+ }
|
|
||||||
+ if sysc {
|
|
||||||
+ if _, _, e := Syscall3(syscall.SYS_PRCTL, prSetKeepCaps, uintptr(i&1), 0); e != 0 {
|
|
||||||
+ t.Fatalf("[%d] psx:prctl(SET_KEEPCAPS, %d) failed: %v", i, i&1, syscall.Errno(e))
|
|
||||||
+ }
|
|
||||||
+ }
|
|
||||||
+ }
|
|
||||||
+ t.Logf("[%d] PASSED kill=%v, sysc=%v", j, kill, sysc)
|
|
||||||
+ }
|
|
||||||
+}
|
|
||||||
--
|
|
||||||
2.29.2
|
|
||||||
|
|
@ -1,12 +1,9 @@
|
|||||||
-------------------------------------------------------------------
|
-------------------------------------------------------------------
|
||||||
Sat Nov 14 10:26:54 UTC 2020 - Dirk Mueller <dmueller@suse.com>
|
Sat Nov 14 10:26:54 UTC 2020 - Dirk Mueller <dmueller@suse.com>
|
||||||
|
|
||||||
- update to 2.45:
|
- update to 2.44:
|
||||||
* Fix the capsh == argument handling and add a test case - bug#209873 (report by Marcus Gelderie)
|
Generally, this is a release to help package builders: no functional change
|
||||||
* Add support for libpsx.so building - bug#206093
|
to any of the generated code just documentation and make related fixes.
|
||||||
* Added build support for systems that do not support libpthread (make PTHREADS=no ...) - bug#209875 (requested by Heiko Thiery)
|
|
||||||
* Recent golang builds (pre-release) default to ignoring GOPATH, so adjust the in-tree building to override this explicitly with GO111MODULE=off
|
|
||||||
* Go package document updates since golang 1.15 is released.
|
|
||||||
|
|
||||||
-------------------------------------------------------------------
|
-------------------------------------------------------------------
|
||||||
Wed Sep 2 17:03:06 UTC 2020 - Dirk Mueller <dmueller@suse.com>
|
Wed Sep 2 17:03:06 UTC 2020 - Dirk Mueller <dmueller@suse.com>
|
||||||
|
17
libcap.spec
17
libcap.spec
@ -25,7 +25,6 @@ Group: Development/Libraries/C and C++
|
|||||||
URL: https://sites.google.com/site/fullycapable/
|
URL: https://sites.google.com/site/fullycapable/
|
||||||
Source: https://www.kernel.org/pub/linux/libs/security/linux-privs/libcap2/libcap-%{version}.tar.xz
|
Source: https://www.kernel.org/pub/linux/libs/security/linux-privs/libcap2/libcap-%{version}.tar.xz
|
||||||
Source2: baselibs.conf
|
Source2: baselibs.conf
|
||||||
Patch: 0001-Allow-a-dying-thread-to-participate-in-the-psx-mecha.patch
|
|
||||||
BuildRequires: fdupes
|
BuildRequires: fdupes
|
||||||
BuildRequires: glibc-devel-static
|
BuildRequires: glibc-devel-static
|
||||||
BuildRequires: pkgconfig
|
BuildRequires: pkgconfig
|
||||||
@ -90,7 +89,6 @@ libcap.
|
|||||||
|
|
||||||
%prep
|
%prep
|
||||||
%setup -q
|
%setup -q
|
||||||
%patch -p1
|
|
||||||
|
|
||||||
%build
|
%build
|
||||||
%global _lto_cflags %{_lto_cflags} -ffat-lto-objects
|
%global _lto_cflags %{_lto_cflags} -ffat-lto-objects
|
||||||
@ -99,12 +97,15 @@ make prefix=%{_prefix} lib=%{_lib} LIBDIR=%{_libdir} SBINDIR=%{_sbindir} \
|
|||||||
|
|
||||||
%install
|
%install
|
||||||
make install RAISE_SETFCAP=no \
|
make install RAISE_SETFCAP=no \
|
||||||
DESTDIR=%{buildroot} \
|
prefix=%{_prefix} \
|
||||||
LIBDIR=/%{_libdir} \
|
lib=%{_lib} \
|
||||||
SBINDIR=/%{_sbindir} \
|
DESTDIR=%{buildroot} \
|
||||||
INCDIR=/%{_includedir} \
|
LIBDIR=/%{_libdir} \
|
||||||
MANDIR=/%{_mandir}/ \
|
SBINDIR=/%{_sbindir} \
|
||||||
PKGCONFIGDIR=%{_libdir}/pkgconfig/
|
INCDIR=/%{_includedir} \
|
||||||
|
MANDIR=/%{_mandir}/ \
|
||||||
|
SHARED=yes \
|
||||||
|
PKGCONFIGDIR=%{_libdir}/pkgconfig/
|
||||||
find %{buildroot} -type f -name "*.la" -delete -print
|
find %{buildroot} -type f -name "*.la" -delete -print
|
||||||
# do not provide static libs
|
# do not provide static libs
|
||||||
rm %{buildroot}%{_libdir}/libcap.a
|
rm %{buildroot}%{_libdir}/libcap.a
|
||||||
|
Loading…
Reference in New Issue
Block a user