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.
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)
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>. */
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);
}
}
+#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,
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 */
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
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 \
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
--- /dev/null
+/* 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;
+}
+
--- /dev/null
+---------------------------------------------------------
+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
+
--- /dev/null
+prereq: test -e scalar_getrandom
+prog: scalar_getrandom
+vgopts: -q
+stderr_filter_args: