Commit 2a148698 authored by David Howells's avatar David Howells Committed by Ralf Baechle
Browse files

Fix breakage in MIPS siginfo handling



MIPS's siginfo handling has been broken since this commit:

	commit 574c4866
	Author: Al Viro <viro@zeniv.linux.org.uk>
	Date:   Sun Nov 25 22:24:19 2012 -0500
	consolidate kernel-side struct sigaction declarations

for 64-bit BE MIPS CPUs.

The UAPI variant looks like this:

	struct sigaction {
		unsigned int	sa_flags;
		__sighandler_t	sa_handler;
		sigset_t	sa_mask;
	};

but the core kernel's variant looks like this:

	struct sigaction {
	#ifndef __ARCH_HAS_ODD_SIGACTION
		__sighandler_t	sa_handler;
		unsigned long	sa_flags;
	#else
		unsigned long	sa_flags;
		__sighandler_t	sa_handler;
	#endif
	#ifdef __ARCH_HAS_SA_RESTORER
		__sigrestore_t sa_restorer;
	#endif
		sigset_t	sa_mask;
	};

The problem is that sa_flags has been changed from an unsigned int to an
unsigned long.

Fix this by making sa_flags unsigned int if __ARCH_HAS_ODD_SIGACTION is
defined.

Whilst we're at it, rename __ARCH_HAS_ODD_SIGACTION to
__ARCH_HAS_IRIX_SIGACTION.

Signed-off-by: default avatarDavid Howells <dhowells@redhat.com>
Cc: linux-mips@linux-mips.org
Cc: linux-kernel@vger.kernel.org
Cc: stable@vger.kernel.org
Acked-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
Signed-off-by: default avatarRalf Baechle <ralf@linux-mips.org>
parent 1762c5ab
Loading
Loading
Loading
Loading
+1 −1
Original line number Original line Diff line number Diff line
@@ -21,6 +21,6 @@
#include <asm/sigcontext.h>
#include <asm/sigcontext.h>
#include <asm/siginfo.h>
#include <asm/siginfo.h>


#define __ARCH_HAS_ODD_SIGACTION
#define __ARCH_HAS_IRIX_SIGACTION


#endif /* _ASM_SIGNAL_H */
#endif /* _ASM_SIGNAL_H */
+2 −2
Original line number Original line Diff line number Diff line
@@ -141,11 +141,11 @@ typedef struct {
} compat_sigset_t;
} compat_sigset_t;


struct compat_sigaction {
struct compat_sigaction {
#ifndef __ARCH_HAS_ODD_SIGACTION
#ifndef __ARCH_HAS_IRIX_SIGACTION
	compat_uptr_t			sa_handler;
	compat_uptr_t			sa_handler;
	compat_ulong_t			sa_flags;
	compat_ulong_t			sa_flags;
#else
#else
	compat_ulong_t			sa_flags;
	compat_uint_t			sa_flags;
	compat_uptr_t			sa_handler;
	compat_uptr_t			sa_handler;
#endif
#endif
#ifdef __ARCH_HAS_SA_RESTORER
#ifdef __ARCH_HAS_SA_RESTORER
+2 −2
Original line number Original line Diff line number Diff line
@@ -250,11 +250,11 @@ extern int show_unhandled_signals;
extern int sigsuspend(sigset_t *);
extern int sigsuspend(sigset_t *);


struct sigaction {
struct sigaction {
#ifndef __ARCH_HAS_ODD_SIGACTION
#ifndef __ARCH_HAS_IRIX_SIGACTION
	__sighandler_t	sa_handler;
	__sighandler_t	sa_handler;
	unsigned long	sa_flags;
	unsigned long	sa_flags;
#else
#else
	unsigned long	sa_flags;
	unsigned int	sa_flags;
	__sighandler_t	sa_handler;
	__sighandler_t	sa_handler;
#endif
#endif
#ifdef __ARCH_HAS_SA_RESTORER
#ifdef __ARCH_HAS_SA_RESTORER