From: trcrsired <uwgghhbcad@gmail.com> The unix_get_current_teb call writes through params->teb, so the PE side must point it at a valid TEB slot. Previously the uninitialized stack pointer caused a NULL dereference in the fallback path used when tpidr_el0 is invalid or reset. Also relax -Werror for unused-command-line-argument during configure probes on Apple Silicon clang. --- configure | 9 ++++++--- configure.ac | 7 +++++-- dlls/ntdll/signal_arm64.c | 11 +++++++---- 3 files changed, 18 insertions(+), 9 deletions(-) diff --git a/configure b/configure index cff47fab188..ad73fa81fd7 100755 --- a/configure +++ b/configure @@ -11376,7 +11376,7 @@ fi saved_sysctl_h_CFLAGS=$CFLAGS -test "x${GCC}" != xyes || CFLAGS="$CFLAGS -Werror" +test "x${GCC}" != xyes || CFLAGS="$CFLAGS -Werror -Wno-error=unused-command-line-argument" ac_fn_c_check_header_compile "$LINENO" "sys/sysctl.h" "ac_cv_header_sys_sysctl_h" "#include <sys/types.h> #ifdef HAVE_SYS_PARAM_H # include <sys/param.h> @@ -20772,7 +20772,9 @@ then : EXTRACFLAGS="$EXTRACFLAGS -Wno-misleading-indentation" fi - { printf '%s\n' "$as_me:${as_lineno-$LINENO}: checking for flags needed for 64-bit compare-and-swap support" >&5 + saved_cas_CFLAGS=$CFLAGS + CFLAGS="$CFLAGS -Wno-error=unused-command-line-argument" + { printf '%s\n' "$as_me:${as_lineno-$LINENO}: checking for flags needed for 64-bit compare-and-swap support" >&5 printf %s "checking for flags needed for 64-bit compare-and-swap support... " >&6; } if test ${wine_cv_64bit_compare_swap+y} then : @@ -20825,7 +20827,7 @@ else case e in #( esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext - CFLAGS=$saved_CFLAGS + CFLAGS=$saved_cas_CFLAGS fi ;; esac fi @@ -20834,6 +20836,7 @@ esac fi { printf '%s\n' "$as_me:${as_lineno-$LINENO}: result: $wine_cv_64bit_compare_swap" >&5 printf '%s\n' "$wine_cv_64bit_compare_swap" >&6; } + CFLAGS=$saved_cas_CFLAGS case "$wine_cv_64bit_compare_swap" in unknown) as_fn_error $? "64-bit compare-and-swap is not supported on this platform" "$LINENO" 5 ;; "none needed") ;; diff --git a/configure.ac b/configure.ac index fdaa2ca7a8b..5553216d07a 100644 --- a/configure.ac +++ b/configure.ac @@ -827,7 +827,7 @@ AC_CHECK_HEADERS([sys/conf.h sys/mount.h sys/statfs.h sys/user.h sys/vfs.h],,, dnl check for broken Linux sysctl.h that causes deprecation warnings saved_sysctl_h_CFLAGS=$CFLAGS -test "x${GCC}" != xyes || CFLAGS="$CFLAGS -Werror" +test "x${GCC}" != xyes || CFLAGS="$CFLAGS -Werror -Wno-error=unused-command-line-argument" AC_CHECK_HEADERS([sys/sysctl.h],,, [#include <sys/types.h> #ifdef HAVE_SYS_PARAM_H @@ -2022,6 +2022,8 @@ then WINE_TRY_CFLAGS([-flarge-source-files -Wmisleading-indentation],[EXTRACFLAGS="$EXTRACFLAGS -Wno-misleading-indentation"]) dnl Check for 64-bit compare-and-swap + saved_cas_CFLAGS=$CFLAGS + CFLAGS="$CFLAGS -Wno-error=unused-command-line-argument" AC_CACHE_CHECK([for flags needed for 64-bit compare-and-swap support], wine_cv_64bit_compare_swap, [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#ifndef __GCC_HAVE_SYNC_COMPARE_AND_SWAP_8 #error no @@ -2040,8 +2042,9 @@ then AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#ifndef __GCC_HAVE_SYNC_COMPARE_AND_SWAP_8 #error no #endif]])],,[wine_cv_64bit_compare_swap="unknown"]) - CFLAGS=$saved_CFLAGS + CFLAGS=$saved_cas_CFLAGS fi])]) + CFLAGS=$saved_cas_CFLAGS case "$wine_cv_64bit_compare_swap" in unknown) AC_MSG_ERROR([64-bit compare-and-swap is not supported on this platform]) ;; "none needed") ;; diff --git a/dlls/ntdll/signal_arm64.c b/dlls/ntdll/signal_arm64.c index d1dea21d421..82a1dbf2c0e 100644 --- a/dlls/ntdll/signal_arm64.c +++ b/dlls/ntdll/signal_arm64.c @@ -851,6 +851,8 @@ struct _TEB * WINAPI NtCurrentTeb(void) __asm__ volatile( "mrs %0, tpidr_el0" : "=r"(t) ); if (t > 0x100000000) /* per-thread TEB in the EL0 thread ID register */ { + if (t > 0x800000000000ULL || t != (ULONG_PTR)__wine_current_teb) + FIXME( "tpidr_el0=%#lx cached=%#lx sp=%#lx\n", t, (ULONG_PTR)__wine_current_teb, (ULONG_PTR)__builtin_frame_address(0) ); __wine_current_teb = t; return (struct _TEB *)t; } @@ -863,12 +865,13 @@ struct _TEB * WINAPI NtCurrentTeb(void) /* tpidr_el0 was reset (fresh code page or signal) and the cached TEB * belongs to another thread; ask the unix side for the current one. */ { - struct get_current_teb_params params; + struct _TEB *current = NULL; + struct get_current_teb_params params = { ¤t }; WINE_UNIX_CALL( unix_get_current_teb, ¶ms ); - if (*params.teb) + if (current) { - __wine_current_teb = (ULONG_PTR)*params.teb; - return *params.teb; + __wine_current_teb = (ULONG_PTR)current; + return current; } } return (struct _TEB *)__wine_current_teb; -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/11638