summaryrefslogtreecommitdiff
path: root/sys/compat/linux
diff options
context:
space:
mode:
authorchristos <christos@NetBSD.org>2005-09-19 02:46:49 +0000
committerchristos <christos@NetBSD.org>2005-09-19 02:46:49 +0000
commitd359ae5c437c5f5e2f849649199cd9fa23c8c94b (patch)
treefa4d3e4cef8b6ddc6e8192388c7d13814a1e1076 /sys/compat/linux
parent089e80014bedcf475768563f659cf9accf38a3ac (diff)
MINSIGSTKSZ on linux is different depending on the platform and usually
smaller than ours.
Diffstat (limited to 'sys/compat/linux')
-rw-r--r--sys/compat/linux/arch/alpha/linux_signal.h4
-rw-r--r--sys/compat/linux/arch/amd64/linux_signal.h4
-rw-r--r--sys/compat/linux/arch/arm/linux_signal.h4
-rw-r--r--sys/compat/linux/arch/i386/linux_signal.h4
-rw-r--r--sys/compat/linux/arch/m68k/linux_signal.h4
-rw-r--r--sys/compat/linux/arch/mips/linux_signal.h4
-rw-r--r--sys/compat/linux/arch/powerpc/linux_signal.h4
-rw-r--r--sys/compat/linux/common/linux_signal.c32
8 files changed, 41 insertions, 19 deletions
diff --git a/sys/compat/linux/arch/alpha/linux_signal.h b/sys/compat/linux/arch/alpha/linux_signal.h
index 61b4e42bb84..cde50b2af04 100644
--- a/sys/compat/linux/arch/alpha/linux_signal.h
+++ b/sys/compat/linux/arch/alpha/linux_signal.h
@@ -1,4 +1,4 @@
-/* $NetBSD: linux_signal.h,v 1.5 2005/05/19 21:16:29 manu Exp $ */
+/* $NetBSD: linux_signal.h,v 1.6 2005/09/19 02:46:49 christos Exp $ */
/*-
* Copyright (c) 1998 The NetBSD Foundation, Inc.
@@ -89,6 +89,8 @@
#define LINUX__NSIG_WORDS (LINUX__NSIG / LINUX__NSIG_BPW)
#define LINUX_NSIG 32
+#define LINUX_MINSIGSTKSZ 4096
+
/* sa_flags */
#define LINUX_SA_ONSTACK 0x00000001
#define LINUX_SA_RESTART 0x00000002
diff --git a/sys/compat/linux/arch/amd64/linux_signal.h b/sys/compat/linux/arch/amd64/linux_signal.h
index 5f2170e28e1..48a3423de2b 100644
--- a/sys/compat/linux/arch/amd64/linux_signal.h
+++ b/sys/compat/linux/arch/amd64/linux_signal.h
@@ -1,4 +1,4 @@
-/* $NetBSD: linux_signal.h,v 1.2 2005/05/19 21:16:29 manu Exp $ */
+/* $NetBSD: linux_signal.h,v 1.3 2005/09/19 02:46:49 christos Exp $ */
/*-
* Copyright (c) 2005 Emmanuel Dreyfus, all rights reserved.
@@ -91,6 +91,8 @@
#define LINUX__NSIG_BPW 64
#define LINUX__NSIG_WORDS (LINUX__NSIG / LINUX__NSIG_BPW)
+#define LINUX_MINSIGSTKSZ 2048
+
typedef unsigned int linux_old_sigset_t;
typedef struct {
diff --git a/sys/compat/linux/arch/arm/linux_signal.h b/sys/compat/linux/arch/arm/linux_signal.h
index 031182400d9..47d0992e1aa 100644
--- a/sys/compat/linux/arch/arm/linux_signal.h
+++ b/sys/compat/linux/arch/arm/linux_signal.h
@@ -1,4 +1,4 @@
-/* $NetBSD: linux_signal.h,v 1.5 2005/05/19 21:16:29 manu Exp $ */
+/* $NetBSD: linux_signal.h,v 1.6 2005/09/19 02:46:49 christos Exp $ */
/*-
* Copyright (c) 1995, 1998 The NetBSD Foundation, Inc.
@@ -98,6 +98,8 @@
#define LINUX_SA_ONESHOT 0x80000000
#define LINUX_SA_ALLBITS 0xfc000007
+#define LINUX_MINSIGSTKSZ 2048
+
typedef void (*linux_handler_t) __P((int));
typedef u_long linux_old_sigset_t;
diff --git a/sys/compat/linux/arch/i386/linux_signal.h b/sys/compat/linux/arch/i386/linux_signal.h
index 66b0b0ba219..4b1e1ae3757 100644
--- a/sys/compat/linux/arch/i386/linux_signal.h
+++ b/sys/compat/linux/arch/i386/linux_signal.h
@@ -1,4 +1,4 @@
-/* $NetBSD: linux_signal.h,v 1.12 2002/11/26 18:42:38 christos Exp $ */
+/* $NetBSD: linux_signal.h,v 1.13 2005/09/19 02:46:49 christos Exp $ */
/*-
* Copyright (c) 1995, 1998 The NetBSD Foundation, Inc.
@@ -98,6 +98,8 @@
#define LINUX_SA_ONESHOT 0x80000000
#define LINUX_SA_ALLBITS 0xfc000007
+#define LINUX_MINSIGSTKSZ 2048
+
typedef void (*linux_handler_t) __P((int));
typedef unsigned long linux_old_sigset_t;
diff --git a/sys/compat/linux/arch/m68k/linux_signal.h b/sys/compat/linux/arch/m68k/linux_signal.h
index a76ba82cf4a..b691e5d1446 100644
--- a/sys/compat/linux/arch/m68k/linux_signal.h
+++ b/sys/compat/linux/arch/m68k/linux_signal.h
@@ -1,4 +1,4 @@
-/* $NetBSD: linux_signal.h,v 1.3 2002/11/26 18:43:21 christos Exp $ */
+/* $NetBSD: linux_signal.h,v 1.4 2005/09/19 02:46:49 christos Exp $ */
/*-
* Copyright (c) 1998 The NetBSD Foundation, Inc.
@@ -108,6 +108,8 @@
#define LINUX_SIG_UNBLOCK 1
#define LINUX_SIG_SETMASK 2
+#define LINUX_MINSIGSTKSZ 2048
+
typedef void (*linux_handler_t) __P((int));
typedef u_long linux_old_sigset_t;
diff --git a/sys/compat/linux/arch/mips/linux_signal.h b/sys/compat/linux/arch/mips/linux_signal.h
index ba4bbbe79c8..53968d9ea09 100644
--- a/sys/compat/linux/arch/mips/linux_signal.h
+++ b/sys/compat/linux/arch/mips/linux_signal.h
@@ -1,4 +1,4 @@
-/* $NetBSD: linux_signal.h,v 1.9 2005/02/26 23:10:19 perry Exp $ */
+/* $NetBSD: linux_signal.h,v 1.10 2005/09/19 02:46:49 christos Exp $ */
/*-
* Copyright (c) 1995, 1998, 2001 The NetBSD Foundation, Inc.
@@ -121,6 +121,8 @@ struct linux_pt_regs {
#define LINUX_SA_ONESHOT LINUX_SA_RESETHAND
#define LINUX_SA_ALLBITS 0xfc010009 /* XXX from i386, not in mips. */
+#define LINUX_MINSIGSTKSZ 2048
+
typedef void (*linux___sighandler_t) __P((int));
typedef unsigned long linux_old_sigset_t;
diff --git a/sys/compat/linux/arch/powerpc/linux_signal.h b/sys/compat/linux/arch/powerpc/linux_signal.h
index 4975b92b416..1b10f0442dc 100644
--- a/sys/compat/linux/arch/powerpc/linux_signal.h
+++ b/sys/compat/linux/arch/powerpc/linux_signal.h
@@ -1,4 +1,4 @@
-/* $NetBSD: linux_signal.h,v 1.7 2005/05/19 21:16:29 manu Exp $ */
+/* $NetBSD: linux_signal.h,v 1.8 2005/09/19 02:46:49 christos Exp $ */
/*-
* Copyright (c) 1995, 1998, 2001 The NetBSD Foundation, Inc.
@@ -105,6 +105,8 @@
#define LINUX_SA_ONESHOT LINUX_SA_RESETHAND
#define LINUX_SA_ALLBITS 0xfc000007
+#define LINUX_MINSIGSTKSZ 2048
+
typedef void (*linux_handler_t) __P((int));
typedef unsigned long linux_old_sigset_t;
diff --git a/sys/compat/linux/common/linux_signal.c b/sys/compat/linux/common/linux_signal.c
index 0b1a765c8f6..18bfba92f63 100644
--- a/sys/compat/linux/common/linux_signal.c
+++ b/sys/compat/linux/common/linux_signal.c
@@ -1,4 +1,4 @@
-/* $NetBSD: linux_signal.c,v 1.47 2005/05/20 01:06:50 mrg Exp $ */
+/* $NetBSD: linux_signal.c,v 1.48 2005/09/19 02:46:49 christos Exp $ */
/*-
* Copyright (c) 1995, 1998 The NetBSD Foundation, Inc.
* All rights reserved.
@@ -54,7 +54,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: linux_signal.c,v 1.47 2005/05/20 01:06:50 mrg Exp $");
+__KERNEL_RCSID(0, "$NetBSD: linux_signal.c,v 1.48 2005/09/19 02:46:49 christos Exp $");
#define COMPAT_LINUX 1
@@ -625,25 +625,33 @@ linux_sys_sigaltstack(l, v, retval)
} */ *uap = v;
struct proc *p = l->l_proc;
struct linux_sigaltstack ss;
- struct sigaltstack nss, oss;
+ struct sigaltstack nss;
int error;
+ if (SCARG(uap, oss)) {
+ native_to_linux_sigaltstack(&ss, &p->p_sigctx.ps_sigstk);
+ if ((error = copyout(&ss, SCARG(uap, oss), sizeof(ss))) != 0)
+ return error;
+ }
+
if (SCARG(uap, ss) != NULL) {
if ((error = copyin(SCARG(uap, ss), &ss, sizeof(ss))) != 0)
return error;
linux_to_native_sigaltstack(&nss, &ss);
- }
- error = sigaltstack1(p,
- SCARG(uap, ss) ? &nss : NULL, SCARG(uap, oss) ? &oss : NULL);
- if (error)
- return error;
+ if (nss.ss_flags & ~SS_ALLBITS)
+ return EINVAL;
- if (SCARG(uap, oss) != NULL) {
- native_to_linux_sigaltstack(&ss, &oss);
- if ((error = copyout(&ss, SCARG(uap, oss), sizeof(ss))) != 0)
- return error;
+ if (nss.ss_flags & SS_DISABLE) {
+ if (p->p_sigctx.ps_sigstk.ss_flags & SS_ONSTACK)
+ return EINVAL;
+ } else {
+ if (nss.ss_size < LINUX_MINSIGSTKSZ)
+ return ENOMEM;
+ }
+ p->p_sigctx.ps_sigstk = nss;
}
+
return 0;
}
#endif /* LINUX_SS_ONSTACK */