Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package libcap for openSUSE:Factory checked in at 2022-02-03 23:16:16 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/libcap (Old) and /work/SRC/openSUSE:Factory/.libcap.new.1898 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "libcap" Thu Feb 3 23:16:16 2022 rev:51 rq:950291 version:2.63 Changes: -------- --- /work/SRC/openSUSE:Factory/libcap/libcap.changes 2022-01-02 16:06:25.195882870 +0100 +++ /work/SRC/openSUSE:Factory/.libcap.new.1898/libcap.changes 2022-02-03 23:16:52.392454381 +0100 @@ -1,0 +2,11 @@ +Mon Jan 31 20:08:24 UTC 2022 - Dirk M??ller <dmuel...@suse.com> + +- update to 2.63: + * restore errno to zero by the time main() is executed + * Consistent psx handling (a panic) for syscalls that return thread dependent + status Inconsistend behavior noticed by Lorenz Bauer + * Add a test case for a deadlock under investigation in golang + * Trim some of the #include file use to make the tree compile more + efficiently + +------------------------------------------------------------------- Old: ---- libcap-2.62.tar.sign libcap-2.62.tar.xz New: ---- libcap-2.63.tar.sign libcap-2.63.tar.xz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ libcap.spec ++++++ --- /var/tmp/diff_new_pack.LgrXYs/_old 2022-02-03 23:16:52.928450722 +0100 +++ /var/tmp/diff_new_pack.LgrXYs/_new 2022-02-03 23:16:52.932450695 +0100 @@ -1,7 +1,7 @@ # # spec file for package libcap # -# Copyright (c) 2021 SUSE LLC +# Copyright (c) 2022 SUSE LLC # # All modifications and additions to the file contributed by third parties # remain the property of their copyright owners, unless otherwise agreed @@ -17,7 +17,7 @@ Name: libcap -Version: 2.62 +Version: 2.63 Release: 0 Summary: Library for Capabilities (linux-privs) Support License: BSD-3-Clause AND GPL-2.0-only ++++++ libcap-2.62.tar.xz -> libcap-2.63.tar.xz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libcap-2.62/Make.Rules new/libcap-2.63/Make.Rules --- old/libcap-2.62/Make.Rules 2021-12-12 03:05:17.000000000 +0100 +++ new/libcap-2.63/Make.Rules 2022-01-24 01:45:25.000000000 +0100 @@ -1,7 +1,7 @@ # Common version number defines for libcap LIBTITLE=libcap VERSION=2 -MINOR=62 +MINOR=63 # ## Optional prefixes: @@ -148,7 +148,7 @@ # vestige of legacy workarounds then. CGO_LDFLAGS_ALLOW := CGO_LDFLAGS_ALLOW="-Wl,-?-wrap[=,][^-.@][^,]*" endif -CGO_CFLAGS := -I$(topdir)/libcap/include +CGO_CFLAGS := $(LIBCAP_INCLUDES) CGO_LDFLAGS := -L$(topdir)/libcap GO_BUILD_FLAGS := endif diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libcap-2.62/Makefile new/libcap-2.63/Makefile --- old/libcap-2.62/Makefile 2021-12-12 00:00:00.000000000 +0100 +++ new/libcap-2.63/Makefile 2022-01-24 01:45:25.000000000 +0100 @@ -52,7 +52,7 @@ $(MAKE) DYNAMIC=no COPTS="-D_FORTIFY_SOURCE=2 -O1 -g" clean test $(MAKE) DYNAMIC=yes clean all test sudotest $(MAKE) DYNAMIC=no COPTS="-O2 -std=c89" clean all test sudotest - $(MAKE) PAM_CAP=no CC=/usr/local/musl/bin/musl-gcc clean all test sudotest + $(MAKE) PAM_CAP=no CC=musl-gcc clean all test sudotest $(MAKE) CC=clang clean all test sudotest $(MAKE) clean all test sudotest $(MAKE) distclean diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libcap-2.62/cap/go.mod new/libcap-2.63/cap/go.mod --- old/libcap-2.62/cap/go.mod 2021-12-12 03:05:53.000000000 +0100 +++ new/libcap-2.63/cap/go.mod 2022-01-24 01:45:25.000000000 +0100 @@ -2,4 +2,4 @@ go 1.11 -require kernel.org/pub/linux/libs/security/libcap/psx v1.2.62 +require kernel.org/pub/linux/libs/security/libcap/psx v1.2.63 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libcap-2.62/contrib/seccomp/go.mod new/libcap-2.63/contrib/seccomp/go.mod --- old/libcap-2.62/contrib/seccomp/go.mod 2021-12-12 03:05:53.000000000 +0100 +++ new/libcap-2.63/contrib/seccomp/go.mod 2022-01-24 01:45:25.000000000 +0100 @@ -2,4 +2,4 @@ go 1.14 -require kernel.org/pub/linux/libs/security/libcap/psx v1.2.62 +require kernel.org/pub/linux/libs/security/libcap/psx v1.2.63 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libcap-2.62/doc/Makefile new/libcap-2.63/doc/Makefile --- old/libcap-2.62/doc/Makefile 2021-12-12 00:00:00.000000000 +0100 +++ new/libcap-2.63/doc/Makefile 2021-12-12 22:47:05.000000000 +0100 @@ -26,7 +26,8 @@ cap_iab_get_proc.3 cap_iab_get_pid.3 cap_iab_set_proc.3 \ cap_iab_to_text.3 cap_iab_from_text.3 cap_iab_get_vector.3 \ cap_iab_set_vector.3 cap_iab_fill.3 \ - psx_syscall.3 psx_syscall3.3 psx_syscall6.3 libpsx.3 + psx_syscall.3 psx_syscall3.3 psx_syscall6.3 psx_set_sensitivity.3 \ + libpsx.3 MAN8S = getcap.8 setcap.8 getpcaps.8 captree.8 MANS = $(MAN1S) $(MAN3S) $(MAN8S) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libcap-2.62/doc/libpsx.3 new/libcap-2.63/doc/libpsx.3 --- old/libcap-2.62/doc/libpsx.3 2021-05-24 21:50:45.000000000 +0200 +++ new/libcap-2.63/doc/libpsx.3 2021-12-12 22:47:05.000000000 +0100 @@ -1,12 +1,13 @@ -.TH LIBPSX 3 "2021-03-06" "" "Linux Programmer's Manual" +.TH LIBPSX 3 "2021-12-12" "" "Linux Programmer's Manual" .SH NAME -psx_syscall3, psx_syscall6 \- POSIX semantics for system calls +psx_syscall3, psx_syscall6, psx_set_sensitivity \- POSIX semantics for system calls .SH SYNOPSIS .nf #include <sys/psx_syscall.h> long int psx_syscall3(long int syscall_nr, long int arg1, long int arg2, long int arg3); long int psx_syscall6(long int syscall_nr, long int arg1, long int arg2, long int arg3, long int arg4, long int arg5, long int arg6); +int psx_set_sensitivity(psx_sensitivity_t sensitivity); .fi .sp Link with one of these: @@ -62,6 +63,17 @@ and .BR psx_syscall6 () functions as needed. +.PP +.BR psx_set_sensitivity () +changes the behavior of the mirrored system calls: +.B PSX_IGNORE +ensures that differences are ignored (the default behavior); +.B PSX_WARNING +prints a stderr notification about how the results differ; and +.B PSX_ERROR +prints the error details and generates a +.B SIGSYS +signal. .SH RETURN VALUE The return value for system call functions is generally the value returned by the kernel, or \-1 in the case of an error. In such cases diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libcap-2.62/doc/psx_set_sensitivity.3 new/libcap-2.63/doc/psx_set_sensitivity.3 --- old/libcap-2.62/doc/psx_set_sensitivity.3 1970-01-01 01:00:00.000000000 +0100 +++ new/libcap-2.63/doc/psx_set_sensitivity.3 2021-12-12 22:47:05.000000000 +0100 @@ -0,0 +1 @@ +.so man3/libpsx.3 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libcap-2.62/go/.gitignore new/libcap-2.63/go/.gitignore --- old/libcap-2.62/go/.gitignore 2021-12-12 00:00:00.000000000 +0100 +++ new/libcap-2.63/go/.gitignore 2022-01-24 01:45:25.000000000 +0100 @@ -2,11 +2,15 @@ compare-cap try-launching try-launching-cgo +psx-fd +psx-fd-cgo psx-signals psx-signals-cgo b210613 b215283 b215283-cgo +mismatch +mismatch-cgo mknames web setid diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libcap-2.62/go/Makefile new/libcap-2.63/go/Makefile --- old/libcap-2.62/go/Makefile 2021-12-12 00:00:00.000000000 +0100 +++ new/libcap-2.63/go/Makefile 2022-01-24 01:45:25.000000000 +0100 @@ -14,7 +14,7 @@ PKGDIR=pkg/$(GOOSARCH)/$(IMPORTDIR) DEPS=../libcap/libcap.a ../libcap/libpsx.a -TESTS=compare-cap try-launching psx-signals +TESTS=compare-cap try-launching psx-signals mismatch all: PSXGOPACKAGE CAPGOPACKAGE web setid gowns captree @@ -83,6 +83,18 @@ CC="$(CC)" CGO_ENABLED="1" $(CGO_LDFLAGS_ALLOW) $(GO) build $(GO_BUILD_FLAGS) -mod=vendor -o $@-cgo $< endif +# This is a test case developed from the deadlock investigation, +# https://github.com/golang/go/issues/50113 . Note the psx-fd.go code +# works when compiled CGO_ENABLED=1, but deadlocks when compiled +# CGO_ENABLED=0. At the time of writing, this is true for go1.16+. +psx-fd: psx-fd.go PSXGOPACKAGE + CC="$(CC)" CGO_ENABLED="$(CGO_REQUIRED)" $(CGO_LDFLAGS_ALLOW) $(GO) build $(GO_BUILD_FLAGS) -mod=vendor -o $@ $< + +ifeq ($(CGO_REQUIRED),0) +psx-fd-cgo: psx-fd.go PSXGOPACKAGE + CC="$(CC)" CGO_ENABLED="1" $(CGO_LDFLAGS_ALLOW) $(GO) build $(GO_BUILD_FLAGS) -mod=vendor -o $@ $< +endif + psx-signals: psx-signals.go PSXGOPACKAGE CC="$(CC)" CGO_ENABLED="$(CGO_REQUIRED)" $(CGO_LDFLAGS_ALLOW) CGO_CFLAGS="$(CGO_CFLAGS)" CGO_LDFLAGS="$(CGO_LDFLAGS)" $(GO) build $(GO_BUILD_FLAGS) -mod=vendor $< @@ -102,14 +114,26 @@ CC="$(CC)" CGO_ENABLED="1" $(CGO_LDFLAGS_ALLOW) CGO_CFLAGS="$(CGO_CFLAGS)" CGO_LDFLAGS="$(CGO_LDFLAGS)" $(GO) build $(GO_BUILD_FLAGS) -mod=vendor -o $@ $< endif -test: setid gowns captree $(TESTS) +mismatch: mismatch.go PSXGOPACKAGE + CC="$(CC)" CGO_ENABLED="$(CGO_REQUIRED)" $(CGO_LDFLAGS_ALLOW) CGO_CFLAGS="$(CGO_CFLAGS)" CGO_LDFLAGS="$(CGO_LDFLAGS)" $(GO) build $(GO_BUILD_FLAGS) -mod=vendor $< + +ifeq ($(CGO_REQUIRED),0) +mismatch-cgo: mismatch.go CAPGOPACKAGE + CC="$(CC)" CGO_ENABLED="1" $(CGO_LDFLAGS_ALLOW) CGO_CFLAGS="$(CGO_CFLAGS)" CGO_LDFLAGS="$(CGO_LDFLAGS)" $(GO) build $(GO_BUILD_FLAGS) -mod=vendor -o $@ $< +endif + +test: setid gowns captree psx-fd $(TESTS) CC="$(CC)" CGO_ENABLED="$(CGO_REQUIRED)" $(CGO_LDFLAGS_ALLOW) $(GO) test -mod=vendor $(IMPORTDIR)/psx CC="$(CC)" CGO_ENABLED="$(CGO_REQUIRED)" $(CGO_LDFLAGS_ALLOW) $(GO) test -mod=vendor $(IMPORTDIR)/cap LD_LIBRARY_PATH=../libcap ./compare-cap ./psx-signals + ./mismatch || exit 0 ; exit 1 + timeout 5 ./psx-fd || echo "this is a known Go bug" ifeq ($(CGO_REQUIRED),0) - $(MAKE) psx-signals-cgo + $(MAKE) psx-signals-cgo mismatch-cgo psx-fd-cgo ./psx-signals-cgo + ./mismatch-cgo || exit 0 ; exit 1 + ./psx-fd-cgo endif ./setid --caps=false ./gowns -- -c "echo gowns runs" @@ -157,4 +181,5 @@ rm -f compare-cap try-launching try-launching-cgo rm -f $(topdir)/cap/*~ $(topdir)/psx/*~ rm -f b210613 b215283 b215283-cgo psx-signals psx-signals-cgo + rm -f mismatch mismatch-cgo psx-fd psx-fd-cgo rm -fr vendor CAPGOPACKAGE PSXGOPACKAGE go.sum diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libcap-2.62/go/go.mod new/libcap-2.63/go/go.mod --- old/libcap-2.62/go/go.mod 2021-12-12 03:05:53.000000000 +0100 +++ new/libcap-2.63/go/go.mod 2022-01-24 01:45:25.000000000 +0100 @@ -3,6 +3,6 @@ go 1.11 require ( - kernel.org/pub/linux/libs/security/libcap/cap v1.2.62 - kernel.org/pub/linux/libs/security/libcap/psx v1.2.62 + kernel.org/pub/linux/libs/security/libcap/cap v1.2.63 + kernel.org/pub/linux/libs/security/libcap/psx v1.2.63 ) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libcap-2.62/go/mismatch.go new/libcap-2.63/go/mismatch.go --- old/libcap-2.62/go/mismatch.go 1970-01-01 01:00:00.000000000 +0100 +++ new/libcap-2.63/go/mismatch.go 2021-12-12 22:47:05.000000000 +0100 @@ -0,0 +1,15 @@ +// Program mismatch should panic because the syscall being requested +// never returns consistent results. +package main + +import ( + "fmt" + "syscall" + + "kernel.org/pub/linux/libs/security/libcap/psx" +) + +func main() { + tid, _, err := psx.Syscall3(syscall.SYS_GETTID, 0, 0, 0) + fmt.Printf("gettid() -> %d: %v\n", tid, err) +} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libcap-2.62/go/psx-fd.go new/libcap-2.63/go/psx-fd.go --- old/libcap-2.62/go/psx-fd.go 1970-01-01 01:00:00.000000000 +0100 +++ new/libcap-2.63/go/psx-fd.go 2022-01-24 01:45:25.000000000 +0100 @@ -0,0 +1,25 @@ +package main + +import ( + "log" + "os" + "syscall" + "time" + + "kernel.org/pub/linux/libs/security/libcap/psx" +) + +const prSetKeepCaps = 8 + +func main() { + r, w, err := os.Pipe() + if err != nil { + log.Fatalf("failed to obtain pipe: %v", err) + } + data := make([]byte, 2+r.Fd()) + go r.Read(data) + time.Sleep(500 * time.Millisecond) + psx.Syscall3(syscall.SYS_PRCTL, prSetKeepCaps, 1, 0) + w.Close() + r.Close() +} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libcap-2.62/goapps/captree/go.mod new/libcap-2.63/goapps/captree/go.mod --- old/libcap-2.62/goapps/captree/go.mod 2021-12-12 03:05:53.000000000 +0100 +++ new/libcap-2.63/goapps/captree/go.mod 2022-01-24 01:45:25.000000000 +0100 @@ -2,4 +2,4 @@ go 1.16 -require kernel.org/pub/linux/libs/security/libcap/cap v1.2.62 +require kernel.org/pub/linux/libs/security/libcap/cap v1.2.63 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libcap-2.62/goapps/gowns/go.mod new/libcap-2.63/goapps/gowns/go.mod --- old/libcap-2.62/goapps/gowns/go.mod 2021-12-12 03:05:53.000000000 +0100 +++ new/libcap-2.63/goapps/gowns/go.mod 2022-01-24 01:45:25.000000000 +0100 @@ -2,4 +2,4 @@ go 1.15 -require kernel.org/pub/linux/libs/security/libcap/cap v1.2.62 +require kernel.org/pub/linux/libs/security/libcap/cap v1.2.63 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libcap-2.62/goapps/setid/go.mod new/libcap-2.63/goapps/setid/go.mod --- old/libcap-2.62/goapps/setid/go.mod 2021-12-12 03:05:53.000000000 +0100 +++ new/libcap-2.63/goapps/setid/go.mod 2022-01-24 01:45:25.000000000 +0100 @@ -3,6 +3,6 @@ go 1.11 require ( - kernel.org/pub/linux/libs/security/libcap/cap v1.2.62 - kernel.org/pub/linux/libs/security/libcap/psx v1.2.62 + kernel.org/pub/linux/libs/security/libcap/cap v1.2.63 + kernel.org/pub/linux/libs/security/libcap/psx v1.2.63 ) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libcap-2.62/goapps/web/go.mod new/libcap-2.63/goapps/web/go.mod --- old/libcap-2.62/goapps/web/go.mod 2021-12-12 03:05:53.000000000 +0100 +++ new/libcap-2.63/goapps/web/go.mod 2022-01-24 01:45:25.000000000 +0100 @@ -2,4 +2,4 @@ go 1.11 -require kernel.org/pub/linux/libs/security/libcap/cap v1.2.62 +require kernel.org/pub/linux/libs/security/libcap/cap v1.2.63 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libcap-2.62/libcap/cap_alloc.c new/libcap-2.63/libcap/cap_alloc.c --- old/libcap-2.62/libcap/cap_alloc.c 2021-11-15 06:19:25.000000000 +0100 +++ new/libcap-2.63/libcap/cap_alloc.c 2022-01-24 01:30:38.000000000 +0100 @@ -19,14 +19,15 @@ __attribute__((constructor (300))) void _libcap_initialize() { + int errno_saved = errno; _cap_mu_lock(&__libcap_mutex); - if (_cap_max_bits) { - _cap_mu_unlock(&__libcap_mutex); - return; + if (!_cap_max_bits) { + cap_set_syscall(NULL, NULL); + _binary_search(_cap_max_bits, cap_get_bound, 0, __CAP_MAXBITS, + __CAP_BITS); } - cap_set_syscall(NULL, NULL); - _binary_search(_cap_max_bits, cap_get_bound, 0, __CAP_MAXBITS, __CAP_BITS); _cap_mu_unlock(&__libcap_mutex); + errno = errno_saved; } cap_value_t cap_max_bits(void) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libcap-2.62/libcap/cap_file.c new/libcap-2.63/libcap/cap_file.c --- old/libcap-2.62/libcap/cap_file.c 2021-10-23 07:22:32.000000000 +0200 +++ new/libcap-2.63/libcap/cap_file.c 2022-01-24 01:45:25.000000000 +0100 @@ -12,7 +12,6 @@ #include <byteswap.h> #include <sys/stat.h> #include <unistd.h> -#include <linux/xattr.h> /* * We hardcode the prototypes for the Linux system calls here since diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libcap-2.62/libcap/cap_proc.c new/libcap-2.63/libcap/cap_proc.c --- old/libcap-2.62/libcap/cap_proc.c 2021-11-22 02:20:50.000000000 +0100 +++ new/libcap-2.63/libcap/cap_proc.c 2022-01-24 01:45:25.000000000 +0100 @@ -18,8 +18,6 @@ #include <sys/types.h> #include <sys/wait.h> -#include <linux/limits.h> - #include "libcap.h" /* diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libcap-2.62/libcap/include/sys/capability.h new/libcap-2.63/libcap/include/sys/capability.h --- old/libcap-2.62/libcap/include/sys/capability.h 2021-11-22 02:20:50.000000000 +0100 +++ new/libcap-2.63/libcap/include/sys/capability.h 2022-01-24 01:45:25.000000000 +0100 @@ -2,7 +2,7 @@ * <sys/capability.h> * * Copyright (C) 1997 Aleph One - * Copyright (C) 1997,8, 2008,19,20 Andrew G. Morgan <mor...@kernel.org> + * Copyright (C) 1997,8, 2008,19-22 Andrew G. Morgan <mor...@kernel.org> * * defunct POSIX.1e Standard: 25.2 Capabilities <sys/capability.h> */ @@ -21,7 +21,6 @@ #include <sys/types.h> #include <stdint.h> -#include <linux/types.h> #ifndef __user #define __user diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libcap-2.62/libcap/include/uapi/linux/capability.h new/libcap-2.63/libcap/include/uapi/linux/capability.h --- old/libcap-2.62/libcap/include/uapi/linux/capability.h 2020-08-14 05:54:41.000000000 +0200 +++ new/libcap-2.63/libcap/include/uapi/linux/capability.h 2022-01-24 01:45:25.000000000 +0100 @@ -14,7 +14,9 @@ #ifndef _UAPI_LINUX_CAPABILITY_H #define _UAPI_LINUX_CAPABILITY_H -#include <linux/types.h> +#include <stdint.h> +#define __u32 uint32_t +#define __le32 __u32 /* User-level do most of the mapping between kernel and user capabilities based on the version tag given by the kernel. The @@ -422,5 +424,4 @@ #define CAP_TO_INDEX(x) ((x) >> 5) /* 1 << 5 == bits in __u32 */ #define CAP_TO_MASK(x) (1u << ((x) & 31)) /* mask for indexed __u32 */ - #endif /* _UAPI_LINUX_CAPABILITY_H */ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libcap-2.62/psx/psx.c new/libcap-2.63/psx/psx.c --- old/libcap-2.62/psx/psx.c 2021-09-18 05:56:21.000000000 +0200 +++ new/libcap-2.63/psx/psx.c 2022-01-24 01:30:38.000000000 +0100 @@ -56,6 +56,8 @@ pthread_mutex_t mu; int pending; int gone; + long int retval; + pid_t tid; } registered_thread_t; static pthread_once_t psx_tracker_initialized = PTHREAD_ONCE_INIT; @@ -81,6 +83,7 @@ psx_tracker_state_t state; int initialized; int psx_sig; + psx_sensitivity_t sensitivity; struct { long syscall_nr; @@ -136,19 +139,20 @@ return; } + long int retval; if (!psx_tracker.cmd.six) { - (void) syscall(psx_tracker.cmd.syscall_nr, - psx_tracker.cmd.arg1, - psx_tracker.cmd.arg2, - psx_tracker.cmd.arg3); + retval = syscall(psx_tracker.cmd.syscall_nr, + psx_tracker.cmd.arg1, + psx_tracker.cmd.arg2, + psx_tracker.cmd.arg3); } else { - (void) syscall(psx_tracker.cmd.syscall_nr, - psx_tracker.cmd.arg1, - psx_tracker.cmd.arg2, - psx_tracker.cmd.arg3, - psx_tracker.cmd.arg4, - psx_tracker.cmd.arg5, - psx_tracker.cmd.arg6); + retval = syscall(psx_tracker.cmd.syscall_nr, + psx_tracker.cmd.arg1, + psx_tracker.cmd.arg2, + psx_tracker.cmd.arg3, + psx_tracker.cmd.arg4, + psx_tracker.cmd.arg5, + psx_tracker.cmd.arg6); } /* @@ -160,6 +164,8 @@ if (ref) { pthread_mutex_lock(&ref->mu); ref->pending = 0; + ref->retval = retval; + ref->tid = syscall(SYS_gettid); pthread_mutex_unlock(&ref->mu); } /* * else thread must be dying and its psx_action_key has already @@ -607,6 +613,7 @@ } psx_unlock(); + int mismatch = 0; for (;;) { int waiting = 0; psx_lock(); @@ -619,8 +626,12 @@ pthread_mutex_lock(&ref->mu); int pending = ref->pending; int gone = ref->gone; - if (pending && !gone) { - gone = (pthread_kill(ref->thread, 0) != 0); + if (!gone) { + if (pending) { + gone = (pthread_kill(ref->thread, 0) != 0); + } else { + mismatch |= (ref->retval != ret); + } } pthread_mutex_unlock(&ref->mu); if (!gone) { @@ -639,10 +650,67 @@ sched_yield(); } - errno = restore_errno; psx_tracker.cmd.active = 0; + if (mismatch) { + psx_lock(); + switch (psx_tracker.sensitivity) { + case PSX_IGNORE: + break; + default: + fprintf(stderr, "psx_syscall result differs.\n"); + if (psx_tracker.cmd.six) { + fprintf(stderr, "trap:%ld a123456=[%ld,%ld,%ld,%ld,%ld,%ld]\n", + psx_tracker.cmd.syscall_nr, + psx_tracker.cmd.arg1, + psx_tracker.cmd.arg2, + psx_tracker.cmd.arg3, + psx_tracker.cmd.arg4, + psx_tracker.cmd.arg5, + psx_tracker.cmd.arg6); + } else { + fprintf(stderr, "trap:%ld a123=[%ld,%ld,%ld]\n", + psx_tracker.cmd.syscall_nr, + psx_tracker.cmd.arg1, + psx_tracker.cmd.arg2, + psx_tracker.cmd.arg3); + } + fprintf(stderr, "results:"); + for (ref = psx_tracker.root; ref; ref = next) { + next = ref->next; + if (ref->thread == self) { + continue; + } + if (ret != ref->retval) { + fprintf(stderr, " %d={%ld}", ref->tid, ref->retval); + } + } + fprintf(stderr, " wanted={%ld}\n", ret); + if (psx_tracker.sensitivity == PSX_WARNING) { + break; + } + pthread_kill(self, SIGSYS); + } + psx_unlock(); + } + errno = restore_errno; psx_new_state(_PSX_SYSCALL, _PSX_IDLE); defer: return ret; } + +/* + * Change the PSX sensitivity level. If the threads appear to have + * diverged in behavior, this can cause the library to notify the + * user. + */ +int psx_set_sensitivity(psx_sensitivity_t level) { + if (level < PSX_IGNORE || level > PSX_ERROR) { + errno = EINVAL; + return -1; + } + psx_lock(); + psx_tracker.sensitivity = level; + psx_unlock(); + return 0; +} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libcap-2.62/psx/psx_cgo.go new/libcap-2.63/psx/psx_cgo.go --- old/libcap-2.62/psx/psx_cgo.go 2021-03-07 04:55:56.000000000 +0100 +++ new/libcap-2.63/psx/psx_cgo.go 2021-12-12 22:47:05.000000000 +0100 @@ -4,6 +4,7 @@ import ( "runtime" + "sync" "syscall" ) @@ -32,6 +33,15 @@ return int(C.__errno_too(C.long(v))) } +var makeFatal sync.Once + +// forceFatal configures the psx_syscall mechanism to PSX_ERROR. +func forceFatal() { + makeFatal.Do(func() { + C.psx_set_sensitivity(C.PSX_ERROR) + }) +} + //go:uintptrescapes // Syscall3 performs a 3 argument syscall. Syscall3 differs from @@ -45,6 +55,7 @@ // If CGO_ENABLED=0 it redirects to the go1.16+ // syscall.AllThreadsSyscall() function. func Syscall3(syscallnr, arg1, arg2, arg3 uintptr) (uintptr, uintptr, syscall.Errno) { + forceFatal() // We lock to the OSThread here because we may need errno to // be the one for this thread. runtime.LockOSThread() @@ -65,6 +76,7 @@ // arguments, its behavior is identical to that of Syscall3() - see // above for the full documentation. func Syscall6(syscallnr, arg1, arg2, arg3, arg4, arg5, arg6 uintptr) (uintptr, uintptr, syscall.Errno) { + forceFatal() // We lock to the OSThread here because we may need errno to // be the one for this thread. runtime.LockOSThread() diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libcap-2.62/psx/psx_syscall.h new/libcap-2.63/psx/psx_syscall.h --- old/libcap-2.62/psx/psx_syscall.h 2021-09-18 05:56:21.000000000 +0200 +++ new/libcap-2.63/psx/psx_syscall.h 2021-12-12 22:47:05.000000000 +0100 @@ -67,6 +67,27 @@ long int, long int, long int, long int, long int, long int)); +/* + * psx_sensitivity_t holds the level of paranoia for non-POSIX syscall + * behavior. The default is PSX_IGNORE: which is best effort - no + * enforcement; PSX_WARNING will dump to stderr a warning when a + * syscall's results differ; PSX_ERROR will dump info as per + * PSX_WARNING and generate a SIGSYS. The current mode can be set with + * psx_set_sensitivity(). + */ +typedef enum { + PSX_IGNORE = 0, + PSX_WARNING = 1, + PSX_ERROR = 2, +} psx_sensitivity_t; + +/* + * psx_set_sensitivity sets the current sensitivity of the PSX + * mechanism. The function returns 0 on success and -1 if the + * requested level is invalid. + */ +int psx_set_sensitivity(psx_sensitivity_t level); + #ifdef __cplusplus } #endif diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libcap-2.62/tests/libcap_launch_test.c new/libcap-2.63/tests/libcap_launch_test.c --- old/libcap-2.62/tests/libcap_launch_test.c 2021-09-27 04:01:29.000000000 +0200 +++ new/libcap-2.63/tests/libcap_launch_test.c 2022-01-24 01:30:38.000000000 +0100 @@ -1,3 +1,4 @@ +#include <errno.h> #include <stdio.h> #include <stdlib.h> #include <string.h> @@ -119,6 +120,11 @@ }, }; + if (errno != 0) { + perror("unexpected initial value for errno"); + exit(1); + } + cap_t orig = cap_get_proc(); if (orig == NULL) { perror("failed to get process capabilities");