]> git.ipfire.org Git - thirdparty/valgrind.git/commitdiff
Solaris syscall: Add support for getrandom(143).
authorIvo Raisr <ivosh@ivosh.net>
Fri, 5 Feb 2016 22:57:42 +0000 (22:57 +0000)
committerIvo Raisr <ivosh@ivosh.net>
Fri, 5 Feb 2016 22:57:42 +0000 (22:57 +0000)
n-i-bz

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

configure.ac
coregrind/m_syswrap/syswrap-solaris.c
include/vki/vki-scnums-solaris.h
memcheck/tests/solaris/Makefile.am
memcheck/tests/solaris/scalar_getrandom.c [new file with mode: 0644]
memcheck/tests/solaris/scalar_getrandom.stderr.exp [new file with mode: 0644]
memcheck/tests/solaris/scalar_getrandom.stdout.exp [new file with mode: 0644]
memcheck/tests/solaris/scalar_getrandom.vgtest [new file with mode: 0644]

index d621dcaf0739af55dc2eb3dc141139ed49ebdbb7..f687bdd4508a9e2ce794c2e9d6d0dd448bddf135 100644 (file)
@@ -2969,6 +2969,32 @@ AC_MSG_RESULT([no])
 AM_CONDITIONAL(SOLARIS_LWP_NAME_SYSCALL, test x$solaris_lwp_name_syscall = xyes)
 
 
+# Solaris-specific check determining if the new getrandom() syscall is
+# available.
+#
+# New syscall (available on Solaris 11):
+# int getrandom(void *buf, size_t buflen, uint_t flags);
+#
+# C-level symbol: SOLARIS_GETRANDOM_SYSCALL
+# Automake-level symbol: SOLARIS_GETRANDOM_SYSCALL
+#
+AC_MSG_CHECKING([for the new `getrandom' syscall (Solaris-specific)])
+AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
+#include <sys/syscall.h>
+]], [[
+  return !SYS_getrandom;
+]])], [
+solaris_getrandom_syscall=yes
+AC_MSG_RESULT([yes])
+AC_DEFINE([SOLARIS_GETRANDOM_SYSCALL], 1,
+          [Define to 1 if you have the new `getrandom' syscall.])
+], [
+solaris_getrandom_syscall=no
+AC_MSG_RESULT([no])
+])
+AM_CONDITIONAL(SOLARIS_GETRANDOM_SYSCALL, test x$solaris_getrandom_syscall = xyes)
+
+
 # Solaris-specific check determining if the new zone() syscall subcodes
 # ZONE_LIST_DEFUNCT and ZONE_GETATTR_DEFUNCT are available.  These subcodes
 # were added in Solaris 11 but are missing on illumos.
@@ -3467,6 +3493,7 @@ AM_CONDITIONAL(SOLARIS_OLD_SYSCALLS, false)
 AM_CONDITIONAL(SOLARIS_LWP_SIGQUEUE_SYSCALL, false)
 AM_CONDITIONAL(SOLARIS_LWP_SIGQUEUE_SYSCALL_TAKES_PID, false)
 AM_CONDITIONAL(SOLARIS_LWP_NAME_SYSCALL, false)
+AM_CONDITIONAL(SOLARIS_GETRANDOM_SYSCALL, false)
 AM_CONDITIONAL(SOLARIS_ZONE_DEFUNCT, false)
 AM_CONDITIONAL(SOLARIS_SHM_NEW, false)
 AM_CONDITIONAL(SOLARIS_PRXREGSET_T, false)
index 384d342a3f2ee6f7f2613f01863af5676451ae9d..df22aec5dd98fdfe7fed386cdb57ab2c784cfe6c 100644 (file)
@@ -28,7 +28,7 @@
    The GNU General Public License is contained in the file COPYING.
 */
 
-/* Copyright 2013-2015, Ivo Raisr <ivosh@ivosh.net>. */
+/* Copyright 2013-2016, Ivo Raisr <ivosh@ivosh.net>. */
 
 /* Copyright 2015-2015, Tomas Jedlicka <jedlickat@gmail.com>. */
 
@@ -989,6 +989,9 @@ DECL_TEMPLATE(solaris, sys_sysconfig);
 DECL_TEMPLATE(solaris, sys_systeminfo);
 DECL_TEMPLATE(solaris, sys_seteuid);
 DECL_TEMPLATE(solaris, sys_forksys);
+#if defined(SOLARIS_GETRANDOM_SYSCALL)
+DECL_TEMPLATE(solaris, sys_getrandom);
+#endif /* SOLARIS_GETRANDOM_SYSCALL */
 DECL_TEMPLATE(solaris, sys_sigtimedwait);
 DECL_TEMPLATE(solaris, sys_yield);
 DECL_TEMPLATE(solaris, sys_lwp_sema_post);
@@ -6461,6 +6464,22 @@ PRE(sys_forksys)
    }
 }
 
+#if defined(SOLARIS_GETRANDOM_SYSCALL)
+PRE(sys_getrandom)
+{
+   /* int getrandom(void *buf, size_t buflen, uint_t flags); */
+   PRINT("sys_getrandom ( %#lx, %lu, %lu )", ARG1, ARG2, ARG3);
+   PRE_REG_READ3(long, "getrandom", void *, buf, vki_size_t, buflen,
+                 vki_uint_t, flags);
+   PRE_MEM_WRITE("getrandom(buf)", ARG1, ARG2);
+}
+
+POST(sys_getrandom)
+{
+   POST_MEM_WRITE(ARG1, RES);
+}
+#endif /* SOLARIS_GETRANDOM_SYSCALL */
+
 PRE(sys_sigtimedwait)
 {
    /* int sigtimedwait(const sigset_t *set, siginfo_t *info,
@@ -10388,6 +10407,9 @@ static SyscallTableEntry syscall_table[] = {
    SOLXY(__NR_systeminfo,           sys_systeminfo),            /* 139 */
    SOLX_(__NR_seteuid,              sys_seteuid),               /* 141 */
    SOLX_(__NR_forksys,              sys_forksys),               /* 142 */
+#if defined(SOLARIS_GETRANDOM_SYSCALL)
+   SOLXY(__NR_getrandom,            sys_getrandom),             /* 143 */
+#endif /* SOLARIS_GETRANDOM_SYSCALL */
    SOLXY(__NR_sigtimedwait,         sys_sigtimedwait),          /* 144 */
    SOLX_(__NR_yield,                sys_yield),                 /* 146 */
    SOLXY(__NR_lwp_sema_post,        sys_lwp_sema_post),         /* 148 */
index 9037a6fb2273918959cbdf4cb879b75f0dd79840..31d072d51002fb7349320ad64c717472f1fbdb13 100644 (file)
@@ -28,7 +28,7 @@
    The GNU General Public License is contained in the file COPYING.
 */
 
-/* Copyright 2013-2015, Ivo Raisr <ivosh@ivosh.net>. */
+/* Copyright 2013-2016, Ivo Raisr <ivosh@ivosh.net>. */
 
 /* Copyright 2013, OmniTI Computer Consulting, Inc. All rights reserved. */
 
 //#define __NR_sharefs                    SYS_sharefs
 #define __NR_seteuid                    SYS_seteuid
 #define __NR_forksys                    SYS_forksys
+#if defined(SOLARIS_GETRANDOM_SYSCALL)
+#define __NR_getrandom                  SYS_getrandom
+#endif /* SOLARIS_GETRANDOM_SYSCALL */
 #define __NR_sigtimedwait               SYS_sigtimedwait
 //#define __NR_lwp_info                   SYS_lwp_info
 #define __NR_yield                      SYS_yield
index 458276983c0733c81c37c42d8a3b710515abd9e2..1a310fa82812cf1313bba22bcdabf122a0eece84 100644 (file)
@@ -30,6 +30,7 @@ EXTRA_DIST = \
        pkcs11.stderr.exp-illumos pkcs11.stderr.exp-solaris pkcs11.stdout.exp pkcs11.vgtest \
        scalar.stderr.exp scalar.stdout.exp scalar.vgtest \
        scalar_frealpathat.stderr.exp scalar_frealpathat.stdout.exp scalar_frealpathat.vgtest \
+       scalar_getrandom.stderr.exp scalar_getrandom.stdout.exp scalar_getrandom.vgtest \
        scalar_ioctl.stderr.exp scalar_ioctl.stdout.exp scalar_ioctl.vgtest \
        scalar_lwp_kill.stderr.exp scalar_lwp_kill.stdout.exp scalar_lwp_kill.vgtest \
        scalar_lwp_name.stderr.exp scalar_lwp_name.stdout.exp scalar_lwp_name.vgtest \
@@ -98,6 +99,10 @@ if SOLARIS_FREALPATHAT_SYSCALL
 check_PROGRAMS += scalar_frealpathat
 endif
 
+if SOLARIS_GETRANDOM_SYSCALL
+check_PROGRAMS += scalar_getrandom
+endif
+
 if SOLARIS_LWP_NAME_SYSCALL
 check_PROGRAMS += scalar_lwp_name
 endif
diff --git a/memcheck/tests/solaris/scalar_getrandom.c b/memcheck/tests/solaris/scalar_getrandom.c
new file mode 100644 (file)
index 0000000..ec43653
--- /dev/null
@@ -0,0 +1,17 @@
+/* Test for getrandom syscall which is available on Solaris 11. */ 
+
+#include "scalar.h"
+
+int main(void)
+{
+   /* Uninitialised, but we know px[0] is 0x0. */
+   long *px = malloc(sizeof(long));
+   x0 = px[0];
+
+   /* SYS_getrandom            143 */
+   GO(SYS_getrandom, "(getrandom) 3s 1m");
+   SY(SYS_getrandom, x0 + 1, x0 + 1, x0); FAIL;
+
+   return 0;
+}
+
diff --git a/memcheck/tests/solaris/scalar_getrandom.stderr.exp b/memcheck/tests/solaris/scalar_getrandom.stderr.exp
new file mode 100644 (file)
index 0000000..2757755
--- /dev/null
@@ -0,0 +1,16 @@
+---------------------------------------------------------
+143:           SYS_getrandom (getrandom) 3s 1m
+---------------------------------------------------------
+Syscall param getrandom(buf) contains uninitialised byte(s)
+   ...
+
+Syscall param getrandom(buflen) contains uninitialised byte(s)
+   ...
+
+Syscall param getrandom(flags) contains uninitialised byte(s)
+   ...
+
+Syscall param getrandom(buf) points to unaddressable byte(s)
+   ...
+ Address 0x........ is not stack'd, malloc'd or (recently) free'd
+
diff --git a/memcheck/tests/solaris/scalar_getrandom.stdout.exp b/memcheck/tests/solaris/scalar_getrandom.stdout.exp
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/memcheck/tests/solaris/scalar_getrandom.vgtest b/memcheck/tests/solaris/scalar_getrandom.vgtest
new file mode 100644 (file)
index 0000000..63430f8
--- /dev/null
@@ -0,0 +1,4 @@
+prereq: test -e scalar_getrandom
+prog: scalar_getrandom
+vgopts: -q
+stderr_filter_args: