From 24e1e9f49324c05c42d240aaede3b09f3eea7839 Mon Sep 17 00:00:00 2001 From: Ivo Raisr Date: Fri, 5 Feb 2016 22:57:42 +0000 Subject: [PATCH] Solaris syscall: Add support for getrandom(143). n-i-bz git-svn-id: svn://svn.valgrind.org/valgrind/trunk@15782 --- configure.ac | 27 +++++++++++++++++++ coregrind/m_syswrap/syswrap-solaris.c | 24 ++++++++++++++++- include/vki/vki-scnums-solaris.h | 5 +++- memcheck/tests/solaris/Makefile.am | 5 ++++ memcheck/tests/solaris/scalar_getrandom.c | 17 ++++++++++++ .../tests/solaris/scalar_getrandom.stderr.exp | 16 +++++++++++ .../tests/solaris/scalar_getrandom.stdout.exp | 0 .../tests/solaris/scalar_getrandom.vgtest | 4 +++ 8 files changed, 96 insertions(+), 2 deletions(-) create mode 100644 memcheck/tests/solaris/scalar_getrandom.c create mode 100644 memcheck/tests/solaris/scalar_getrandom.stderr.exp create mode 100644 memcheck/tests/solaris/scalar_getrandom.stdout.exp create mode 100644 memcheck/tests/solaris/scalar_getrandom.vgtest diff --git a/configure.ac b/configure.ac index d621dcaf07..f687bdd450 100644 --- a/configure.ac +++ b/configure.ac @@ -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 +]], [[ + 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) diff --git a/coregrind/m_syswrap/syswrap-solaris.c b/coregrind/m_syswrap/syswrap-solaris.c index 384d342a3f..df22aec5dd 100644 --- a/coregrind/m_syswrap/syswrap-solaris.c +++ b/coregrind/m_syswrap/syswrap-solaris.c @@ -28,7 +28,7 @@ The GNU General Public License is contained in the file COPYING. */ -/* Copyright 2013-2015, Ivo Raisr . */ +/* Copyright 2013-2016, Ivo Raisr . */ /* Copyright 2015-2015, Tomas Jedlicka . */ @@ -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 */ diff --git a/include/vki/vki-scnums-solaris.h b/include/vki/vki-scnums-solaris.h index 9037a6fb22..31d072d510 100644 --- a/include/vki/vki-scnums-solaris.h +++ b/include/vki/vki-scnums-solaris.h @@ -28,7 +28,7 @@ The GNU General Public License is contained in the file COPYING. */ -/* Copyright 2013-2015, Ivo Raisr . */ +/* Copyright 2013-2016, Ivo Raisr . */ /* Copyright 2013, OmniTI Computer Consulting, Inc. All rights reserved. */ @@ -194,6 +194,9 @@ //#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 diff --git a/memcheck/tests/solaris/Makefile.am b/memcheck/tests/solaris/Makefile.am index 458276983c..1a310fa828 100644 --- a/memcheck/tests/solaris/Makefile.am +++ b/memcheck/tests/solaris/Makefile.am @@ -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 index 0000000000..ec4365327c --- /dev/null +++ b/memcheck/tests/solaris/scalar_getrandom.c @@ -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 index 0000000000..2757755624 --- /dev/null +++ b/memcheck/tests/solaris/scalar_getrandom.stderr.exp @@ -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 index 0000000000..e69de29bb2 diff --git a/memcheck/tests/solaris/scalar_getrandom.vgtest b/memcheck/tests/solaris/scalar_getrandom.vgtest new file mode 100644 index 0000000000..63430f801f --- /dev/null +++ b/memcheck/tests/solaris/scalar_getrandom.vgtest @@ -0,0 +1,4 @@ +prereq: test -e scalar_getrandom +prog: scalar_getrandom +vgopts: -q +stderr_filter_args: -- 2.47.2