diff options
| author | christos <christos@NetBSD.org> | 2005-09-19 02:46:49 +0000 |
|---|---|---|
| committer | christos <christos@NetBSD.org> | 2005-09-19 02:46:49 +0000 |
| commit | d359ae5c437c5f5e2f849649199cd9fa23c8c94b (patch) | |
| tree | fa4d3e4cef8b6ddc6e8192388c7d13814a1e1076 /sys/compat/linux | |
| parent | 089e80014bedcf475768563f659cf9accf38a3ac (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.h | 4 | ||||
| -rw-r--r-- | sys/compat/linux/arch/amd64/linux_signal.h | 4 | ||||
| -rw-r--r-- | sys/compat/linux/arch/arm/linux_signal.h | 4 | ||||
| -rw-r--r-- | sys/compat/linux/arch/i386/linux_signal.h | 4 | ||||
| -rw-r--r-- | sys/compat/linux/arch/m68k/linux_signal.h | 4 | ||||
| -rw-r--r-- | sys/compat/linux/arch/mips/linux_signal.h | 4 | ||||
| -rw-r--r-- | sys/compat/linux/arch/powerpc/linux_signal.h | 4 | ||||
| -rw-r--r-- | sys/compat/linux/common/linux_signal.c | 32 |
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 */ |
