sparc: fix sigaction for 32bit builds [BZ #18694]

Message ID 1437392055-27715-1-git-send-email-vapier@gentoo.org
State Committed
Delegated to: Mike Frysinger
Headers

Commit Message

Mike Frysinger July 20, 2015, 11:34 a.m. UTC
  Commit a059d359d86130b5fa74e04a978c8523a0293f77 changed the sigaction
struct to pass conform tests, but it ended up also changing the ABI for
32 bit builds.  For 64 bit builds, changing the long to two ints works,
but for 32 bit builds, it inserts 4 extra bytes.  This leads to many
packages randomly failing like bash that spews things like:
	configure: line 471: wait_for: No record of process 0

Bracket the new member by a wordsize check to fix the ABI for 32bit.
---
 ChangeLog                                      | 7 +++++++
 NEWS                                           | 2 +-
 sysdeps/unix/sysv/linux/sparc/bits/sigaction.h | 4 ++++
 3 files changed, 12 insertions(+), 1 deletion(-)
  

Comments

David Miller July 20, 2015, 4:40 p.m. UTC | #1
From: Mike Frysinger <vapier@gentoo.org>
Date: Mon, 20 Jul 2015 07:34:15 -0400

> Commit a059d359d86130b5fa74e04a978c8523a0293f77 changed the sigaction
> struct to pass conform tests, but it ended up also changing the ABI for
> 32 bit builds.  For 64 bit builds, changing the long to two ints works,
> but for 32 bit builds, it inserts 4 extra bytes.  This leads to many
> packages randomly failing like bash that spews things like:
> 	configure: line 471: wait_for: No record of process 0
> 
> Bracket the new member by a wordsize check to fix the ABI for 32bit.

This is definitely correct, please commit to master and all active
release branches.
  
Mike Frysinger July 21, 2015, 2 a.m. UTC | #2
On 20 Jul 2015 09:40, David Miller wrote:
> From: Mike Frysinger <vapier@gentoo.org>
> Date: Mon, 20 Jul 2015 07:34:15 -0400
> 
> > Commit a059d359d86130b5fa74e04a978c8523a0293f77 changed the sigaction
> > struct to pass conform tests, but it ended up also changing the ABI for
> > 32 bit builds.  For 64 bit builds, changing the long to two ints works,
> > but for 32 bit builds, it inserts 4 extra bytes.  This leads to many
> > packages randomly failing like bash that spews things like:
> > 	configure: line 471: wait_for: No record of process 0
> > 
> > Bracket the new member by a wordsize check to fix the ABI for 32bit.
> 
> This is definitely correct, please commit to master and all active
> release branches.

i've pushed with this additional NEWS entry:
+* The 32-bit sparc sigaction ABI was inadvertently broken in the 2.20 and 2.21
+  releases.  It has been fixed to match 2.19 and older, but binaries built
+  against 2.20 and 2.21 might need to be recompiled.  See BZ#18694.

and i cherry picked it to the 2.20 and 2.21 branches
-mike
  

Patch

diff --git a/ChangeLog b/ChangeLog
index 1265017..d039dbe 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@ 
+2015-07-20  Mike Frysinger  <vapier@gentoo.org>
+
+	[BZ #18694]
+	* sysdeps/unix/sysv/linux/sparc/bits/sigaction.h: Include
+	bits/wordsize.h.
+	(sigaction): Declare __glibc_reserved0 only when __WORDSIZE is 64.
+
 2015-07-16  David S. Miller  <davem@davemloft.net>
 
 	* sysdeps/sparc/fpu/libm-test-ulps: Regenerated.
diff --git a/NEWS b/NEWS
index fc84560..d60e3c7 100644
--- a/NEWS
+++ b/NEWS
@@ -27,7 +27,7 @@  Version 2.22
   18522, 18527, 18528, 18529, 18530, 18532, 18533, 18534, 18536, 18539,
   18540, 18542, 18544, 18545, 18546, 18547, 18549, 18553, 18557, 18558,
   18569, 18583, 18585, 18586, 18592, 18593, 18594, 18602, 18612, 18613,
-  18619, 18633, 18641, 18643, 18648, 18676.
+  18619, 18633, 18641, 18643, 18648, 18676, 18694.
 
 * Cache information can be queried via sysconf() function on s390 e.g. with
   _SC_LEVEL1_ICACHE_SIZE as argument.
diff --git a/sysdeps/unix/sysv/linux/sparc/bits/sigaction.h b/sysdeps/unix/sysv/linux/sparc/bits/sigaction.h
index 0750b52..3af5541 100644
--- a/sysdeps/unix/sysv/linux/sparc/bits/sigaction.h
+++ b/sysdeps/unix/sysv/linux/sparc/bits/sigaction.h
@@ -20,6 +20,8 @@ 
 # error "Never include <bits/sigaction.h> directly; use <signal.h> instead."
 #endif
 
+#include <bits/wordsize.h>
+
 /* Structure describing the action to be taken when a signal arrives.  */
 struct sigaction
   {
@@ -43,7 +45,9 @@  struct sigaction
     __sigset_t sa_mask;
 
     /* Special flags.  */
+#if __WORDSIZE == 64
     int __glibc_reserved0;
+#endif
     int sa_flags;
 
     /* Not used by Linux/Sparc yet.  */