From: Ivo Raisr Date: Sun, 20 Nov 2016 00:20:34 +0000 (+0000) Subject: Solaris: Add syscall wrapper for sigsuspend(95) X-Git-Tag: svn/VALGRIND_3_13_0~277 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=8e08fc91ec3f0d963b0588ca588b815e8d2bbf48;p=thirdparty%2Fvalgrind.git Solaris: Add syscall wrapper for sigsuspend(95) n-i-bz git-svn-id: svn://svn.valgrind.org/valgrind/trunk@16144 --- diff --git a/coregrind/m_syswrap/syswrap-solaris.c b/coregrind/m_syswrap/syswrap-solaris.c index a059c2167f..edc6672993 100644 --- a/coregrind/m_syswrap/syswrap-solaris.c +++ b/coregrind/m_syswrap/syswrap-solaris.c @@ -956,6 +956,7 @@ DECL_TEMPLATE(solaris, sys_getmsg); DECL_TEMPLATE(solaris, sys_putmsg); DECL_TEMPLATE(solaris, sys_lstat); DECL_TEMPLATE(solaris, sys_sigprocmask); +DECL_TEMPLATE(solaris, sys_sigsuspend); DECL_TEMPLATE(solaris, sys_sigaction); DECL_TEMPLATE(solaris, sys_sigpending); DECL_TEMPLATE(solaris, sys_getsetcontext); @@ -4807,6 +4808,26 @@ POST(sys_sigprocmask) POST_MEM_WRITE(ARG3, sizeof(vki_sigset_t)); } +PRE(sys_sigsuspend) +{ + *flags |= SfMayBlock; + + /* int sigsuspend(const sigset_t *set); */ + PRINT("sys_sigsuspend ( %#lx )", ARG1); + PRE_REG_READ1(long, "sigsuspend", vki_sigset_t *, set); + PRE_MEM_READ("sigsuspend(set)", ARG1, sizeof(vki_sigset_t)); + + /* Be safe. */ + if (ARG1 && ML_(safe_to_deref((void *) ARG1, sizeof(vki_sigset_t)))) { + VG_(sigdelset)((vki_sigset_t *) ARG1, VG_SIGVGKILL); + /* We cannot mask VG_SIGVGKILL, as otherwise this thread would not + be killable by VG_(nuke_all_threads_except). + We thus silently ignore the user request to mask this signal. + Note that this is similar to what is done for e.g. + sigprocmask (see m_signals.c calculate_SKSS_from_SCSS). */ + } +} + PRE(sys_sigaction) { /* int sigaction(int signal, const struct sigaction *act, @@ -10717,6 +10738,7 @@ static SyscallTableEntry syscall_table[] = { GENX_(__NR_fchown, sys_fchown), /* 94 */ #endif /* SOLARIS_OLD_SYSCALLS */ SOLXY(__NR_sigprocmask, sys_sigprocmask), /* 95 */ + SOLX_(__NR_sigsuspend, sys_sigsuspend), /* 96 */ GENXY(__NR_sigaltstack, sys_sigaltstack), /* 97 */ SOLXY(__NR_sigaction, sys_sigaction), /* 98 */ SOLXY(__NR_sigpending, sys_sigpending), /* 99 */ diff --git a/include/vki/vki-scnums-solaris.h b/include/vki/vki-scnums-solaris.h index 2a6b6dea45..aba743c13e 100644 --- a/include/vki/vki-scnums-solaris.h +++ b/include/vki/vki-scnums-solaris.h @@ -144,7 +144,7 @@ #define __NR_setgroups SYS_setgroups #define __NR_getgroups SYS_getgroups #define __NR_sigprocmask SYS_sigprocmask -//#define __NR_sigsuspend SYS_sigsuspend +#define __NR_sigsuspend SYS_sigsuspend #define __NR_sigaltstack SYS_sigaltstack #define __NR_sigaction SYS_sigaction #define __NR_sigpending SYS_sigpending diff --git a/memcheck/tests/solaris/scalar.c b/memcheck/tests/solaris/scalar.c index 8e72b65f6a..36bd4090a2 100644 --- a/memcheck/tests/solaris/scalar.c +++ b/memcheck/tests/solaris/scalar.c @@ -1885,7 +1885,8 @@ int main(void) SY(SYS_sigprocmask, x0, x0 + 1, x0 + 1); FAILx(EFAULT); /* SYS_sigsuspend 96 */ - /* XXX Missing wrapper. */ + GO(SYS_sigsuspend, "1s 1m"); + SY(SYS_sigsuspend, x0 + 1); FAILx(EFAULT); /* SYS_sigaltstack 97 */ GO(SYS_sigaltstack, "2s 2m"); diff --git a/memcheck/tests/solaris/scalar.stderr.exp b/memcheck/tests/solaris/scalar.stderr.exp index 78f91084ed..c9c9d58625 100644 --- a/memcheck/tests/solaris/scalar.stderr.exp +++ b/memcheck/tests/solaris/scalar.stderr.exp @@ -1622,6 +1622,16 @@ Syscall param sigprocmask(oset) points to unaddressable byte(s) ... Address 0x........ is not stack'd, malloc'd or (recently) free'd +--------------------------------------------------------- + 96: SYS_sigsuspend 1s 1m +--------------------------------------------------------- +Syscall param sigsuspend(set) contains uninitialised byte(s) + ... + +Syscall param sigsuspend(set) points to unaddressable byte(s) + ... + Address 0x........ is not stack'd, malloc'd or (recently) free'd + --------------------------------------------------------- 97: SYS_sigaltstack 2s 2m ---------------------------------------------------------