Accepting request 536906 from home:Andreas_Schwab:Factory

- spawni-assert.patch: Fix improper assert in Linux posix_spawn (BZ
  #22273)

OBS-URL: https://build.opensuse.org/request/show/536906
OBS-URL: https://build.opensuse.org/package/show/Base:System/glibc?expand=0&rev=484
This commit is contained in:
Andreas Schwab 2017-10-26 14:50:40 +00:00 committed by Git OBS Bridge
parent a41899225a
commit ed5747cf2b
7 changed files with 98 additions and 0 deletions

View File

@ -1,3 +1,9 @@
-------------------------------------------------------------------
Thu Oct 26 08:40:52 UTC 2017 - schwab@suse.de
- spawni-assert.patch: Fix improper assert in Linux posix_spawn (BZ
#22273)
-------------------------------------------------------------------
Mon Oct 23 09:35:18 UTC 2017 - schwab@suse.de

View File

@ -309,6 +309,8 @@ Patch1018: sysconf-uio-maxiov.patch
Patch1019: glob-tilde-overflow.patch
# PATCH-FIX-UPSTREAM x86-64: Use fxsave/xsave/xsavec in _dl_runtime_resolve (BZ #21265)
Patch1020: dl-runtime-resolve-xsave.patch
# PATCH-FIX-UPSTREAM posix: Fix improper assert in Linux posix_spawn (BZ #22273)
Patch1021: spawni-assert.patch
###
# Patches awaiting upstream approval
@ -540,6 +542,7 @@ rm nscd/s-stamp
%patch1018 -p1
%patch1019 -p1
%patch1020 -p1
%patch1021 -p1
%patch2000 -p1
%patch2001 -p1

View File

@ -1,3 +1,9 @@
-------------------------------------------------------------------
Thu Oct 26 08:40:52 UTC 2017 - schwab@suse.de
- spawni-assert.patch: Fix improper assert in Linux posix_spawn (BZ
#22273)
-------------------------------------------------------------------
Mon Oct 23 09:35:18 UTC 2017 - schwab@suse.de

View File

@ -309,6 +309,8 @@ Patch1018: sysconf-uio-maxiov.patch
Patch1019: glob-tilde-overflow.patch
# PATCH-FIX-UPSTREAM x86-64: Use fxsave/xsave/xsavec in _dl_runtime_resolve (BZ #21265)
Patch1020: dl-runtime-resolve-xsave.patch
# PATCH-FIX-UPSTREAM posix: Fix improper assert in Linux posix_spawn (BZ #22273)
Patch1021: spawni-assert.patch
###
# Patches awaiting upstream approval
@ -540,6 +542,7 @@ rm nscd/s-stamp
%patch1018 -p1
%patch1019 -p1
%patch1020 -p1
%patch1021 -p1
%patch2000 -p1
%patch2001 -p1

View File

@ -1,3 +1,9 @@
-------------------------------------------------------------------
Thu Oct 26 08:40:52 UTC 2017 - schwab@suse.de
- spawni-assert.patch: Fix improper assert in Linux posix_spawn (BZ
#22273)
-------------------------------------------------------------------
Mon Oct 23 09:35:18 UTC 2017 - schwab@suse.de

View File

@ -315,6 +315,8 @@ Patch1018: sysconf-uio-maxiov.patch
Patch1019: glob-tilde-overflow.patch
# PATCH-FIX-UPSTREAM x86-64: Use fxsave/xsave/xsavec in _dl_runtime_resolve (BZ #21265)
Patch1020: dl-runtime-resolve-xsave.patch
# PATCH-FIX-UPSTREAM posix: Fix improper assert in Linux posix_spawn (BZ #22273)
Patch1021: spawni-assert.patch
###
# Patches awaiting upstream approval
@ -546,6 +548,7 @@ rm nscd/s-stamp
%patch1018 -p1
%patch1019 -p1
%patch1020 -p1
%patch1021 -p1
%patch2000 -p1
%patch2001 -p1

71
spawni-assert.patch Normal file
View File

@ -0,0 +1,71 @@
2017-10-23 Adhemerval Zanella <adhemerval.zanella@linaro.org>
* sysdeps/unix/sysv/linux/spawni.c (__spawnix): Use 0 instead of
WNOHANG in waitpid call.
2017-10-20 Adhemerval Zanella <adhemerval.zanella@linaro.org>
[BZ #22273]
* sysdeps/unix/sysv/linux/spawni.c (__spawnix): Handle the case where
the auxiliary process is terminated by a signal before calling _exit
or execve.
Index: glibc-2.26/sysdeps/unix/sysv/linux/spawni.c
===================================================================
--- glibc-2.26.orig/sysdeps/unix/sysv/linux/spawni.c
+++ glibc-2.26/sysdeps/unix/sysv/linux/spawni.c
@@ -17,7 +17,6 @@
<http://www.gnu.org/licenses/>. */
#include <spawn.h>
-#include <assert.h>
#include <fcntl.h>
#include <paths.h>
#include <string.h>
@@ -268,7 +267,6 @@ __spawni_child (void *arguments)
__sigprocmask (SIG_SETMASK, (attr->__flags & POSIX_SPAWN_SETSIGMASK)
? &attr->__ss : &args->oldmask, 0);
- args->err = 0;
args->exec (args->file, args->argv, args->envp);
/* This is compatibility function required to enable posix_spawn run
@@ -339,7 +337,7 @@ __spawnix (pid_t * pid, const char *file
/* Child must set args.err to something non-negative - we rely on
the parent and child sharing VM. */
- args.err = -1;
+ args.err = 0;
args.file = file;
args.exec = exec;
args.fa = file_actions;
@@ -362,12 +360,26 @@ __spawnix (pid_t * pid, const char *file
new_pid = CLONE (__spawni_child, STACK (stack, stack_size), stack_size,
CLONE_VM | CLONE_VFORK | SIGCHLD, &args);
+ /* It needs to collect the case where the auxiliary process was created
+ but failed to execute the file (due either any preparation step or
+ for execve itself). */
if (new_pid > 0)
{
+ /* Also, it handles the unlikely case where the auxiliary process was
+ terminated before calling execve as if it was successfully. The
+ args.err is set to 0 as default and changed to a positive value
+ only in case of failure, so in case of premature termination
+ due a signal args.err will remain zeroed and it will be up to
+ caller to actually collect it. */
ec = args.err;
- assert (ec >= 0);
- if (ec != 0)
- __waitpid (new_pid, NULL, 0);
+ if (ec > 0)
+ /* There still an unlikely case where the child is cancelled after
+ setting args.err, due to a positive error value. Also there is
+ possible pid reuse race (where the kernel allocated the same pid
+ to an unrelated process). Unfortunately due synchronization
+ issues where the kernel might not have the process collected
+ the waitpid below can not use WNOHANG. */
+ __waitpid (new_pid, NULL, 0);
}
else
ec = -new_pid;