|
From: Paul F. <pa...@so...> - 2026-03-18 19:45:24
|
https://sourceware.org/cgit/valgrind/commit/?id=e4bce03a6e5e7c3a0b967090695dee27ec5c4d00 commit e4bce03a6e5e7c3a0b967090695dee27ec5c4d00 Author: Paul Floyd <pj...@wa...> Date: Wed Mar 18 20:41:00 2026 +0100 Bug 512291 - Valgrind on Solaris should drop support for long gone /dev/crypto framework Initial patch provided by Vladimír Marek <vlm...@gm...>. I've changed it a bit to add a configure test and break out a new solaris regtest, scalar_crypto. Diff: --- .gitignore | 1 + NEWS | 2 ++ configure.ac | 8 +++++ coregrind/m_syswrap/syswrap-solaris.c | 16 +++++++--- include/vki/vki-solaris.h | 6 ++-- memcheck/tests/solaris/Makefile.am | 5 ++++ memcheck/tests/solaris/scalar_crypto.c | 40 +++++++++++++++++++++++++ memcheck/tests/solaris/scalar_crypto.stderr.exp | 32 ++++++++++++++++++++ memcheck/tests/solaris/scalar_crypto.vgtest | 5 ++++ memcheck/tests/solaris/scalar_ioctl.c | 24 --------------- memcheck/tests/solaris/scalar_ioctl.stderr.exp | 32 -------------------- 11 files changed, 109 insertions(+), 62 deletions(-) diff --git a/.gitignore b/.gitignore index 8f9ba9ece7..7b3b1a6267 100644 --- a/.gitignore +++ b/.gitignore @@ -1315,6 +1315,7 @@ /memcheck/tests/solaris/pkcs11 /memcheck/tests/solaris/scalar /memcheck/tests/solaris/scalar_auditon_stat +/memcheck/tests/solaris/scalar_crypto /memcheck/tests/solaris/scalar_frealpathat /memcheck/tests/solaris/scalar_getrandom /memcheck/tests/solaris/scalar_ioctl diff --git a/NEWS b/NEWS index 1e5df7fc37..aa7080b967 100644 --- a/NEWS +++ b/NEWS @@ -82,6 +82,8 @@ are not entered into bugzilla tend to get forgotten about or ignored. '-Wno-alloc-size-larger-than=18446744073709551615' 512030 s390x: bfp-convert testcase fails 512037 malloc trace does not print free size or alignment +512291 Valgrind on Solaris should drop support for long gone /dev/crypto + framework 512571 regtest problems with darwin dsymutil 512873 Add SSE4.1 min/max instructions for x86 32 bit 513257 Add missing syswraps for lsm_list_modules diff --git a/configure.ac b/configure.ac index 1739305d60..587b620be1 100644 --- a/configure.ac +++ b/configure.ac @@ -4053,6 +4053,14 @@ fi if test "$VGCONF_OS" = "solaris" ; then AC_CHECK_HEADERS([sys/lgrp_user_impl.h]) +AC_CHECK_HEADER([sys/crypto/ioctl.h], [ + AC_DEFINE([HAVE_SYS_CRYPTO_IOCTL_H], [1], [Define to 1 if sys/crypto/ioctl.h is available.]) + ac_have_sys_crypto_ioctl_h=yes +], [ + ac_have_sys_crypto_ioctl_h=no +]) +AM_CONDITIONAL(SOLARIS_HAVE_SYS_CRYPTO_IOCTL_H, test x$ac_have_sys_crypto_ioctl_h = xyes ) + # Solaris-specific check determining if the Sun Studio Assembler is used to # build Valgrind. The test checks if the x86/amd64 assembler understands the # cmovl.l instruction, if yes then it's Sun Assembler. diff --git a/coregrind/m_syswrap/syswrap-solaris.c b/coregrind/m_syswrap/syswrap-solaris.c index 3a8e691e2b..a2ab87ac02 100644 --- a/coregrind/m_syswrap/syswrap-solaris.c +++ b/coregrind/m_syswrap/syswrap-solaris.c @@ -3305,6 +3305,7 @@ PRE(sys_ioctl) PRE_MEM_WRITE("ioctl(FIOGETOWN)", ARG3, sizeof(vki_pid_t)); break; +#if defined(HAVE_SYS_CRYPTO_IOCTL_H) /* CRYPTO */ case VKI_CRYPTO_GET_PROVIDER_LIST: { @@ -3322,7 +3323,8 @@ PRE(sys_ioctl) when we know pre-handler succeeded. */ } - break; + break; +#endif /* dtrace */ case VKI_DTRACEHIOC_REMOVE: @@ -3354,9 +3356,13 @@ PRE(sys_ioctl) /* Be strict. */ if (!ML_(fd_allowed)(ARG1, "ioctl", tid, False)) { SET_STATUS_Failure(VKI_EBADF); - } else if (ARG2 == VKI_CRYPTO_GET_PROVIDER_LIST) { - /* Save the requested count to unused ARG4 now. */ - ARG4 = ARG3; + } else { +#if defined(HAVE_SYS_CRYPTO_IOCTL_H) + if (ARG2 == VKI_CRYPTO_GET_PROVIDER_LIST) { + /* Save the requested count to unused ARG4 now. */ + ARG4 = ARG3; + } +#endif } } @@ -3554,6 +3560,7 @@ POST(sys_ioctl) POST_MEM_WRITE(ARG3, sizeof(vki_pid_t)); break; +#if defined(HAVE_SYS_CRYPTO_IOCTL_H) /* CRYPTO */ case VKI_CRYPTO_GET_PROVIDER_LIST: { @@ -3568,6 +3575,7 @@ POST(sys_ioctl) sizeof(vki_crypto_provider_entry_t)); } break; +#endif /* dtrace */ case VKI_DTRACEHIOC_REMOVE: diff --git a/include/vki/vki-solaris.h b/include/vki/vki-solaris.h index 8d9d687092..13c43a9795 100644 --- a/include/vki/vki-solaris.h +++ b/include/vki/vki-solaris.h @@ -335,14 +335,16 @@ typedef struct vki_kcf_door_arg_s { } vki_da_u; } vki_kcf_door_arg_t; - +// https://bugs.kde.org/show_bug.cgi?id=512291 +// crypto ioctl removed from Solaris late 2025 +#if defined(HAVE_SYS_CRYPTO_IOCTL_H) #include <sys/crypto/ioctl.h> #define VKI_CRYPTO_SUCCESS CRYPTO_SUCCESS #define VKI_CRYPTO_GET_PROVIDER_LIST CRYPTO_GET_PROVIDER_LIST #define vki_crypto_provider_id_t crypto_provider_id_t #define vki_crypto_provider_entry_t crypto_provider_entry_t #define vki_crypto_get_provider_list_t crypto_get_provider_list_t - +#endif #include <sys/dditypes.h> #include <sys/devinfo_impl.h> diff --git a/memcheck/tests/solaris/Makefile.am b/memcheck/tests/solaris/Makefile.am index 36e3a18529..0201c5f44e 100644 --- a/memcheck/tests/solaris/Makefile.am +++ b/memcheck/tests/solaris/Makefile.am @@ -32,6 +32,7 @@ EXTRA_DIST = \ pkcs11.stderr.exp-illumos pkcs11.stderr.exp-solaris pkcs11.vgtest \ scalar.stderr.exp scalar.vgtest \ scalar_auditon_stat.stderr.exp scalar_auditon_stat.vgtest \ + scalar_crypto.stderr.exp scalar_crypto.vgtest \ scalar_frealpathat.stderr.exp scalar_frealpathat.vgtest \ scalar_getrandom.stderr.exp scalar_getrandom.vgtest \ scalar_getrandom.stderr.exp-illumos \ @@ -107,6 +108,10 @@ if SOLARIS_AUDITON_STAT check_PROGRAMS += scalar_auditon_stat endif +if SOLARIS_HAVE_SYS_CRYPTO_IOCTL_H +check_PROGRAMS += scalar_crypto +endif + if SOLARIS_FREALPATHAT_SYSCALL check_PROGRAMS += scalar_frealpathat endif diff --git a/memcheck/tests/solaris/scalar_crypto.c b/memcheck/tests/solaris/scalar_crypto.c new file mode 100644 index 0000000000..179481da57 --- /dev/null +++ b/memcheck/tests/solaris/scalar_crypto.c @@ -0,0 +1,40 @@ +/* Basic ioctl scalar tests. */ + +#define __EXTENSIONS__ 1 + +#include "scalar.h" + +#include <sys/crypto/ioctl.h> + +/* crypto */ +__attribute__((noinline)) +static void sys_ioctl_CRYPTO_GET_PROVIDER_LIST(void) +{ + GO(SYS_ioctl, "(CRYPTO_GET_PROVIDER_LIST) 3s 1m"); + SY(SYS_ioctl, x0 - 1, x0 + CRYPTO_GET_PROVIDER_LIST, x0 + 1); FAIL; +} + +__attribute__((noinline)) +static void sys_ioctl_CRYPTO_GET_PROVIDER_LIST_2(void) +{ + crypto_get_provider_list_t pl; + + pl.pl_count = x0 + 1; + + GO(SYS_ioctl, "(CRYPTO_GET_PROVIDER_LIST) 4s 0m"); + SY(SYS_ioctl, x0 - 1, x0 + CRYPTO_GET_PROVIDER_LIST, &pl + x0); FAIL; +} + +int main(void) +{ + /* Uninitialised, but we know px[0] is 0x0. */ + long *px = malloc(sizeof(long)); + x0 = px[0]; + + /* crypto */ + sys_ioctl_CRYPTO_GET_PROVIDER_LIST(); + sys_ioctl_CRYPTO_GET_PROVIDER_LIST_2(); + + return 0; +} + diff --git a/memcheck/tests/solaris/scalar_crypto.stderr.exp b/memcheck/tests/solaris/scalar_crypto.stderr.exp new file mode 100644 index 0000000000..69ba261a93 --- /dev/null +++ b/memcheck/tests/solaris/scalar_crypto.stderr.exp @@ -0,0 +1,32 @@ +--------------------------------------------------------- + 54: SYS_ioctl (CRYPTO_GET_PROVIDER_LIST) 3s 1m +--------------------------------------------------------- +Syscall param ioctl(fd) contains uninitialised byte(s) + ... + +Syscall param ioctl(request) contains uninitialised byte(s) + ... + +Syscall param ioctl(arg) contains uninitialised byte(s) + ... + +Syscall param ioctl(CRYPTO_GET_PROVIDER_LIST, pl->pl_count) points to unaddressable byte(s) + ... + Address 0x........ is not stack'd, malloc'd or (recently) free'd + +--------------------------------------------------------- + 54: SYS_ioctl (CRYPTO_GET_PROVIDER_LIST) 4s 0m +--------------------------------------------------------- +Syscall param ioctl(fd) contains uninitialised byte(s) + ... + +Syscall param ioctl(request) contains uninitialised byte(s) + ... + +Syscall param ioctl(arg) contains uninitialised byte(s) + ... + +Syscall param ioctl(CRYPTO_GET_PROVIDER_LIST, pl->pl_count) points to uninitialised byte(s) + ... + Address 0x........ is on thread 1's stack + diff --git a/memcheck/tests/solaris/scalar_crypto.vgtest b/memcheck/tests/solaris/scalar_crypto.vgtest new file mode 100644 index 0000000000..2e476e5258 --- /dev/null +++ b/memcheck/tests/solaris/scalar_crypto.vgtest @@ -0,0 +1,5 @@ +prereq: test -e scalar_crypto +prog: scalar_crypto +vgopts: -q --error-limit=no +stderr_filter: filter_scalar +stderr_filter_args: libc diff --git a/memcheck/tests/solaris/scalar_ioctl.c b/memcheck/tests/solaris/scalar_ioctl.c index e9e70eee56..db5916e3dc 100644 --- a/memcheck/tests/solaris/scalar_ioctl.c +++ b/memcheck/tests/solaris/scalar_ioctl.c @@ -5,7 +5,6 @@ #include "scalar.h" #include <net/if.h> -#include <sys/crypto/ioctl.h> #include <sys/dditypes.h> #include <sys/devinfo_impl.h> #include <sys/dtrace.h> @@ -459,25 +458,6 @@ static void sys_ioctl_FIOGETOWN(void) SY(SYS_ioctl, x0 - 1, x0 + FIOGETOWN, x0 + 1); FAIL; } -/* crypto */ -__attribute__((noinline)) -static void sys_ioctl_CRYPTO_GET_PROVIDER_LIST(void) -{ - GO(SYS_ioctl, "(CRYPTO_GET_PROVIDER_LIST) 3s 1m"); - SY(SYS_ioctl, x0 - 1, x0 + CRYPTO_GET_PROVIDER_LIST, x0 + 1); FAIL; -} - -__attribute__((noinline)) -static void sys_ioctl_CRYPTO_GET_PROVIDER_LIST_2(void) -{ - crypto_get_provider_list_t pl; - - pl.pl_count = x0 + 1; - - GO(SYS_ioctl, "(CRYPTO_GET_PROVIDER_LIST) 4s 0m"); - SY(SYS_ioctl, x0 - 1, x0 + CRYPTO_GET_PROVIDER_LIST, &pl + x0); FAIL; -} - /* dtrace */ __attribute__((noinline)) static void sys_ioctl_DTRACEHIOC_REMOVE(void) @@ -578,10 +558,6 @@ int main(void) sys_ioctl_FIOSETOWN(); sys_ioctl_FIOGETOWN(); - /* crypto */ - sys_ioctl_CRYPTO_GET_PROVIDER_LIST(); - sys_ioctl_CRYPTO_GET_PROVIDER_LIST_2(); - /* dtrace */ sys_ioctl_DTRACEHIOC_REMOVE(); sys_ioctl_DTRACEHIOC_ADDDOF(); diff --git a/memcheck/tests/solaris/scalar_ioctl.stderr.exp b/memcheck/tests/solaris/scalar_ioctl.stderr.exp index 2112c7d73a..045e602631 100644 --- a/memcheck/tests/solaris/scalar_ioctl.stderr.exp +++ b/memcheck/tests/solaris/scalar_ioctl.stderr.exp @@ -867,38 +867,6 @@ Syscall param ioctl(FIOGETOWN) points to unaddressable byte(s) ... Address 0x........ is not stack'd, malloc'd or (recently) free'd ---------------------------------------------------------- - 54: SYS_ioctl (CRYPTO_GET_PROVIDER_LIST) 3s 1m ---------------------------------------------------------- -Syscall param ioctl(fd) contains uninitialised byte(s) - ... - -Syscall param ioctl(request) contains uninitialised byte(s) - ... - -Syscall param ioctl(arg) contains uninitialised byte(s) - ... - -Syscall param ioctl(CRYPTO_GET_PROVIDER_LIST, pl->pl_count) points to unaddressable byte(s) - ... - Address 0x........ is not stack'd, malloc'd or (recently) free'd - ---------------------------------------------------------- - 54: SYS_ioctl (CRYPTO_GET_PROVIDER_LIST) 4s 0m ---------------------------------------------------------- -Syscall param ioctl(fd) contains uninitialised byte(s) - ... - -Syscall param ioctl(request) contains uninitialised byte(s) - ... - -Syscall param ioctl(arg) contains uninitialised byte(s) - ... - -Syscall param ioctl(CRYPTO_GET_PROVIDER_LIST, pl->pl_count) points to uninitialised byte(s) - ... - Address 0x........ is on thread 1's stack - --------------------------------------------------------- 54: SYS_ioctl (DTRACEHIOC_REMOVE) 3s 0m --------------------------------------------------------- |