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);
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,
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 */
#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
...
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
---------------------------------------------------------