[Glibc-bsd-commits] r5171 - in trunk/kfreebsd-10/debian: . patches
Robert Millan
rmh at moszumanska.debian.org
Tue Nov 26 13:52:23 UTC 2013
Author: rmh
Date: 2013-11-26 13:52:22 +0000 (Tue, 26 Nov 2013)
New Revision: 5171
Added:
trunk/kfreebsd-10/debian/patches/si_status_wait6.diff
Modified:
trunk/kfreebsd-10/debian/changelog
trunk/kfreebsd-10/debian/patches/series
Log:
si_status_wait6.diff: Chery-pick r258281 from HEAD to fix siginfo_t.si_status for wait6/waitid/SIGCHLD. (Closes: #729698)
Modified: trunk/kfreebsd-10/debian/changelog
===================================================================
--- trunk/kfreebsd-10/debian/changelog 2013-11-26 13:48:42 UTC (rev 5170)
+++ trunk/kfreebsd-10/debian/changelog 2013-11-26 13:52:22 UTC (rev 5171)
@@ -7,13 +7,15 @@
[ Robert Millan ]
* Disable mipsel builds. (Closes: #727829)
+ * si_status_wait6.diff: Chery-pick r258281 from HEAD to fix
+ siginfo_t.si_status for wait6/waitid/SIGCHLD. (Closes: #729698)
[ Steven Chamberlain ]
* The wildcard for ARM is any-arm.
* Don't make sys/conf/kmod_syms.awk executable.
* Brand kernel image as FreeBSD type, in case not building on kfreebsd
- -- Robert Millan <rmh at debian.org> Tue, 26 Nov 2013 14:14:02 +0100
+ -- Robert Millan <rmh at debian.org> Tue, 26 Nov 2013 14:50:55 +0100
kfreebsd-10 (10.0~svn257123-1) experimental; urgency=low
Modified: trunk/kfreebsd-10/debian/patches/series
===================================================================
--- trunk/kfreebsd-10/debian/patches/series 2013-11-26 13:48:42 UTC (rev 5170)
+++ trunk/kfreebsd-10/debian/patches/series 2013-11-26 13:52:22 UTC (rev 5171)
@@ -1,4 +1,5 @@
# Patches from (or merged in) upstream
+si_status_wait6.diff
# Patches that are in good shape for merging upstream
mount_remount.diff
Added: trunk/kfreebsd-10/debian/patches/si_status_wait6.diff
===================================================================
--- trunk/kfreebsd-10/debian/patches/si_status_wait6.diff (rev 0)
+++ trunk/kfreebsd-10/debian/patches/si_status_wait6.diff 2013-11-26 13:52:22 UTC (rev 5171)
@@ -0,0 +1,94 @@
+------------------------------------------------------------------------
+r258281 | jilles | 2013-11-17 23:31:23 +0100 (dg, 17 nov 2013) | 15 lines
+
+Fix siginfo_t.si_status for wait6/waitid/SIGCHLD.
+
+Per POSIX, si_status should contain the value passed to exit() for
+si_code==CLD_EXITED and the signal number for other si_code. This was
+incorrect for CLD_EXITED and CLD_DUMPED.
+
+This is still not fully POSIX-compliant (Austin group issue #594 says that
+the full value passed to exit() shall be returned via si_status, not just
+the low 8 bits) but is sufficient for a si_status-related test in libnih
+(upstart, Debian/kFreeBSD).
+
+PR: kern/184002
+Reported by: Dmitrijs Ledkovs
+Tested by: Dmitrijs Ledkovs
+
+--- a/sys/kern/kern_exit.c
++++ b/sys/kern/kern_exit.c
+@@ -974,16 +974,19 @@
+ * This is still a rough estimate. We will fix the
+ * cases TRAPPED, STOPPED, and CONTINUED later.
+ */
+- if (WCOREDUMP(p->p_xstat))
++ if (WCOREDUMP(p->p_xstat)) {
+ siginfo->si_code = CLD_DUMPED;
+- else if (WIFSIGNALED(p->p_xstat))
++ siginfo->si_status = WTERMSIG(p->p_xstat);
++ } else if (WIFSIGNALED(p->p_xstat)) {
+ siginfo->si_code = CLD_KILLED;
+- else
++ siginfo->si_status = WTERMSIG(p->p_xstat);
++ } else {
+ siginfo->si_code = CLD_EXITED;
++ siginfo->si_status = WEXITSTATUS(p->p_xstat);
++ }
+
+ siginfo->si_pid = p->p_pid;
+ siginfo->si_uid = p->p_ucred->cr_uid;
+- siginfo->si_status = p->p_xstat;
+
+ /*
+ * The si_addr field would be useful additional
+--- a/sys/kern/kern_sig.c
++++ b/sys/kern/kern_sig.c
+@@ -2959,7 +2959,7 @@
+ }
+
+ static void
+-childproc_jobstate(struct proc *p, int reason, int status)
++childproc_jobstate(struct proc *p, int reason, int sig)
+ {
+ struct sigacts *ps;
+
+@@ -2979,7 +2979,7 @@
+ mtx_lock(&ps->ps_mtx);
+ if ((ps->ps_flag & PS_NOCLDSTOP) == 0) {
+ mtx_unlock(&ps->ps_mtx);
+- sigparent(p, reason, status);
++ sigparent(p, reason, sig);
+ } else
+ mtx_unlock(&ps->ps_mtx);
+ }
+@@ -2987,6 +2987,7 @@
+ void
+ childproc_stopped(struct proc *p, int reason)
+ {
++ /* p_xstat is a plain signal number, not a full wait() status here. */
+ childproc_jobstate(p, reason, p->p_xstat);
+ }
+
+@@ -3000,13 +3001,15 @@
+ childproc_exited(struct proc *p)
+ {
+ int reason;
+- int status = p->p_xstat; /* convert to int */
++ int xstat = p->p_xstat; /* convert to int */
++ int status;
+
+- reason = CLD_EXITED;
+- if (WCOREDUMP(status))
+- reason = CLD_DUMPED;
+- else if (WIFSIGNALED(status))
+- reason = CLD_KILLED;
++ if (WCOREDUMP(xstat))
++ reason = CLD_DUMPED, status = WTERMSIG(xstat);
++ else if (WIFSIGNALED(xstat))
++ reason = CLD_KILLED, status = WTERMSIG(xstat);
++ else
++ reason = CLD_EXITED, status = WEXITSTATUS(xstat);
+ /*
+ * XXX avoid calling wakeup(p->p_pptr), the work is
+ * done in exit1().
More information about the Glibc-bsd-commits
mailing list