]> git.ipfire.org Git - thirdparty/valgrind.git/commitdiff
Solaris: Add syscall wrapper for sigsuspend(95)
authorIvo Raisr <ivosh@ivosh.net>
Sun, 20 Nov 2016 00:20:34 +0000 (00:20 +0000)
committerIvo Raisr <ivosh@ivosh.net>
Sun, 20 Nov 2016 00:20:34 +0000 (00:20 +0000)
n-i-bz

git-svn-id: svn://svn.valgrind.org/valgrind/trunk@16144

coregrind/m_syswrap/syswrap-solaris.c
include/vki/vki-scnums-solaris.h
memcheck/tests/solaris/scalar.c
memcheck/tests/solaris/scalar.stderr.exp

index a059c2167f1bcf2bbb0308039406cfe7d8112e07..edc6672993e0454b8b069f421fe5d6c373e73687 100644 (file)
@@ -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 */
index 2a6b6dea4560776613ed9e3eca57534661ba591e..aba743c13e2e07602e6542fb48ae6c0bff80fd38 100644 (file)
 #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
index 8e72b65f6abd13b0b564d020df5048ad8dbff548..36bd4090a2d330c1186085f7a116f66496e1c2be 100644 (file)
@@ -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");
index 78f91084ed04e6b3ee213c4f09a34394a9fce7db..c9c9d586256ae99dc38857886d524930aadb1e78 100644 (file)
@@ -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
 ---------------------------------------------------------