According to Linux man sigaltstack(3) shall return EINVAL if the ss
argument is not a null pointer, and the ss_flags member pointed to by ss contains flags other than SS_DISABLE. However, in fact, Linux also allows SS_ONSTACK flag which is simply ignored. For buggy apps (at least mono) ignore other than SS_DISABLE flags as a Linux do. While here move MI part of sigaltstack code to the appropriate place. Reported by: abi at abinet dot ru
This commit is contained in:
parent
76672e1113
commit
a7ac457613
@ -250,9 +250,6 @@ struct l_newstat {
|
||||
#define LINUX_SS_ONSTACK 1
|
||||
#define LINUX_SS_DISABLE 2
|
||||
|
||||
int linux_to_bsd_sigaltstack(int lsa);
|
||||
int bsd_to_linux_sigaltstack(int bsa);
|
||||
|
||||
typedef void (*l_handler_t)(l_int);
|
||||
|
||||
typedef struct {
|
||||
|
@ -87,29 +87,6 @@ __FBSDID("$FreeBSD$");
|
||||
#include <compat/linux/linux_util.h>
|
||||
#include <compat/linux/linux_emul.h>
|
||||
|
||||
int
|
||||
linux_to_bsd_sigaltstack(int lsa)
|
||||
{
|
||||
int bsa = 0;
|
||||
|
||||
if (lsa & LINUX_SS_DISABLE)
|
||||
bsa |= SS_DISABLE;
|
||||
if (lsa & LINUX_SS_ONSTACK)
|
||||
bsa |= SS_ONSTACK;
|
||||
return (bsa);
|
||||
}
|
||||
|
||||
int
|
||||
bsd_to_linux_sigaltstack(int bsa)
|
||||
{
|
||||
int lsa = 0;
|
||||
|
||||
if (bsa & SS_DISABLE)
|
||||
lsa |= LINUX_SS_DISABLE;
|
||||
if (bsa & SS_ONSTACK)
|
||||
lsa |= LINUX_SS_ONSTACK;
|
||||
return (lsa);
|
||||
}
|
||||
|
||||
int
|
||||
linux_execve(struct thread *td, struct linux_execve_args *args)
|
||||
|
@ -328,9 +328,6 @@ struct l_statfs64 {
|
||||
#define LINUX_SS_ONSTACK 1
|
||||
#define LINUX_SS_DISABLE 2
|
||||
|
||||
int linux_to_bsd_sigaltstack(int lsa);
|
||||
int bsd_to_linux_sigaltstack(int bsa);
|
||||
|
||||
typedef l_uintptr_t l_handler_t;
|
||||
typedef l_ulong l_osigset_t;
|
||||
|
||||
|
@ -84,34 +84,10 @@ struct l_old_select_argv {
|
||||
l_uintptr_t timeout;
|
||||
} __packed;
|
||||
|
||||
int
|
||||
linux_to_bsd_sigaltstack(int lsa)
|
||||
{
|
||||
int bsa = 0;
|
||||
|
||||
if (lsa & LINUX_SS_DISABLE)
|
||||
bsa |= SS_DISABLE;
|
||||
if (lsa & LINUX_SS_ONSTACK)
|
||||
bsa |= SS_ONSTACK;
|
||||
return (bsa);
|
||||
}
|
||||
|
||||
static int linux_mmap_common(struct thread *td, l_uintptr_t addr,
|
||||
l_size_t len, l_int prot, l_int flags, l_int fd,
|
||||
l_loff_t pos);
|
||||
|
||||
int
|
||||
bsd_to_linux_sigaltstack(int bsa)
|
||||
{
|
||||
int lsa = 0;
|
||||
|
||||
if (bsa & SS_DISABLE)
|
||||
lsa |= LINUX_SS_DISABLE;
|
||||
if (bsa & SS_ONSTACK)
|
||||
lsa |= LINUX_SS_ONSTACK;
|
||||
return (lsa);
|
||||
}
|
||||
|
||||
static void
|
||||
bsd_to_linux_rusage(struct rusage *ru, struct l_rusage *lru)
|
||||
{
|
||||
|
@ -754,6 +754,32 @@ siginfo_to_lsiginfo(const siginfo_t *si, l_siginfo_t *lsi, l_int sig)
|
||||
}
|
||||
}
|
||||
|
||||
int
|
||||
linux_to_bsd_sigaltstack(int lsa)
|
||||
{
|
||||
int bsa = 0;
|
||||
|
||||
if (lsa & LINUX_SS_DISABLE)
|
||||
bsa |= SS_DISABLE;
|
||||
/*
|
||||
* Linux ignores SS_ONSTACK flag for ss
|
||||
* parameter while FreeBSD prohibits it.
|
||||
*/
|
||||
return (bsa);
|
||||
}
|
||||
|
||||
int
|
||||
bsd_to_linux_sigaltstack(int bsa)
|
||||
{
|
||||
int lsa = 0;
|
||||
|
||||
if (bsa & SS_DISABLE)
|
||||
lsa |= LINUX_SS_DISABLE;
|
||||
if (bsa & SS_ONSTACK)
|
||||
lsa |= LINUX_SS_ONSTACK;
|
||||
return (lsa);
|
||||
}
|
||||
|
||||
void
|
||||
lsiginfo_to_ksiginfo(const l_siginfo_t *lsi, ksiginfo_t *ksi, int sig)
|
||||
{
|
||||
|
@ -46,6 +46,8 @@
|
||||
extern int bsd_to_linux_signal[];
|
||||
extern int linux_to_bsd_signal[];
|
||||
|
||||
int linux_to_bsd_sigaltstack(int lsa);
|
||||
int bsd_to_linux_sigaltstack(int bsa);
|
||||
void linux_to_bsd_sigset(l_sigset_t *, sigset_t *);
|
||||
void bsd_to_linux_sigset(sigset_t *, l_sigset_t *);
|
||||
int linux_do_sigaction(struct thread *, int, l_sigaction_t *, l_sigaction_t *);
|
||||
|
@ -303,9 +303,6 @@ struct l_statfs64 {
|
||||
#define LINUX_SS_ONSTACK 1
|
||||
#define LINUX_SS_DISABLE 2
|
||||
|
||||
int linux_to_bsd_sigaltstack(int lsa);
|
||||
int bsd_to_linux_sigaltstack(int bsa);
|
||||
|
||||
typedef void (*l_handler_t)(l_int);
|
||||
typedef l_ulong l_osigset_t;
|
||||
|
||||
|
@ -99,29 +99,6 @@ static int linux_mmap_common(struct thread *td, l_uintptr_t addr,
|
||||
l_size_t len, l_int prot, l_int flags, l_int fd,
|
||||
l_loff_t pos);
|
||||
|
||||
int
|
||||
linux_to_bsd_sigaltstack(int lsa)
|
||||
{
|
||||
int bsa = 0;
|
||||
|
||||
if (lsa & LINUX_SS_DISABLE)
|
||||
bsa |= SS_DISABLE;
|
||||
if (lsa & LINUX_SS_ONSTACK)
|
||||
bsa |= SS_ONSTACK;
|
||||
return (bsa);
|
||||
}
|
||||
|
||||
int
|
||||
bsd_to_linux_sigaltstack(int bsa)
|
||||
{
|
||||
int lsa = 0;
|
||||
|
||||
if (bsa & SS_DISABLE)
|
||||
lsa |= LINUX_SS_DISABLE;
|
||||
if (bsa & SS_ONSTACK)
|
||||
lsa |= LINUX_SS_ONSTACK;
|
||||
return (lsa);
|
||||
}
|
||||
|
||||
int
|
||||
linux_execve(struct thread *td, struct linux_execve_args *args)
|
||||
|
Loading…
x
Reference in New Issue
Block a user