diff mbox

S/390: xfail test POSIX/signal.h

Message ID lghffg$ak5$1@ger.gmane.org
State New
Headers show

Commit Message

Stefan Liebler March 21, 2014, 1:40 p.m. UTC
On 03/14/2014 03:30 PM, Joseph S. Myers wrote:
> On Fri, 14 Mar 2014, Stefan Liebler wrote:
>> Hi,
>> on S390x the conformance test conform/POSIX/signal.h/conform.out is failing,
>> due to incorrect type.
>> The member sa_flags in struct sigaction on s390x is defined
>> as unsigned long instead of int due to the kernel struct.
>> On other platforms, sa_flags is also unsigned long: ia64, sparc, hppa.
> If you need to XFAIL such a test on an architecture-specific basis, the
> XFAIL should have a comment explaining why the test is expected to fail.
> However, in this case I don't see the need to XFAIL it.  As far as I can
> tell, the upper bits of sa_flags aren't actually assigned.  So you should
> be able to change the structure so that sa_flags is int, with an adjacent
> padding field.  This would mean random padding is passed to the kernel in
> what the kernel thinks is the high part of the field, so you should either
> get kernel agreement that this is OK, or make glibc's sigaction
> implementation copy the structure and zero the padding.
> (Again, file a bug in glibc Bugzilla before fixing it.)

i talked to the kernel guys and the kernel has no problem with the 
padding variable and its random content.
So i added the padding variable and changed sa_flags to int in order to 
be POSIX conform.
Afterwards tested on S390/S390x.

Is this okay?

2014-03-21  Stefan Liebler  <stli@linux.vnet.ibm.com>

	[BZ #16713]
	* sysdeps/unix/sysv/linux/s390/bits/sigaction.h
	(__glibc_reserved0): New variable.
	(sa_flags): Change type to int.
diff mbox


diff --git a/sysdeps/unix/sysv/linux/s390/bits/sigaction.h b/sysdeps/unix/sysv/linux/s390/bits/sigaction.h
index f8baf84..b60b8f8 100644
--- a/sysdeps/unix/sysv/linux/s390/bits/sigaction.h
+++ b/sysdeps/unix/sysv/linux/s390/bits/sigaction.h
@@ -43,7 +43,8 @@  struct sigaction
     /* Special flags.  */
-    unsigned long int sa_flags;
+    int __glibc_reserved0;
+    int sa_flags;
     /* Restore handler.  */
     void (*sa_restorer) (void);