Re: [V3][PATCH] selftests/x86: Fix error: variably modified 'altstack_data' at file scope

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi all,

What about this patch?

Thanks
Jun


On 8/24/21 10:43 AM, Jun Miao wrote:
Based on glibc 2.33 -> 2.34, there is one new feature:

NEWS for version 2.34
=====================
Major new features:
  * Add _SC_MINSIGSTKSZ and _SC_SIGSTKSZ.  When _DYNAMIC_STACK_SIZE_SOURCE
    or _GNU_SOURCE are defined, MINSIGSTKSZ and SIGSTKSZ are no longer
    constant on Linux.  MINSIGSTKSZ is redefined to sysconf(_SC_MINSIGSTKSZ)
    and SIGSTKSZ is redefined to sysconf (_SC_SIGSTKSZ).  This supports
    dynamic sized register sets for modern architectural features like
    Arm SVE.
=====================

If _SC_SIGSTKSZ_SOURCE or _GNU_SOURCE are defined, MINSIGSTKSZ and SIGSTKSZ
are redefined as:

/* Default stack size for a signal handler: sysconf (SC_SIGSTKSZ).  */
  # undef SIGSTKSZ
  # define SIGSTKSZ sysconf (_SC_SIGSTKSZ)

/* Minimum stack size for a signal handler: SIGSTKSZ.  */
  # undef MINSIGSTKSZ
  # define MINSIGSTKSZ SIGSTKSZ

Compilation will fail if the source assumes constant MINSIGSTKSZ or
SIGSTKSZ.

Build error with the GNU C Library 2.34:
DEBUG:	| sigreturn.c:150:13: error: variably modified 'altstack_data' at file scope
| sigreturn.c:150:13: error: variably modified 'altstack_data' at file scope
DEBUG:	|   150 | static char altstack_data[SIGSTKSZ];
|   150 | static char altstack_data[SIGSTKSZ];
DEBUG:	|       |             ^~~~~~~~~~~~~

DEBUG:  | single_step_syscall.c:60:22: error: variably modified 'altstack_data' at file scope
DEBUG:  |   60 | static unsigned char altstack_data[SIGSTKSZ];
DEBUG:  |      |                      ^~~~~~~~~~~~~

Link: https://sourceware.org/pipermail/libc-alpha/2021-January/121996.html
Link: https://sourceware.org/pipermail/libc-alpha/2021-August/129718.html
Suggested-by: Jianwei Hu <jianwei.hu@xxxxxxxxxxxxx>
Signed-off-by: Jun Miao <jun.miao@xxxxxxxxxxxxx>
---
  tools/testing/selftests/x86/mov_ss_trap.c         | 4 ++--
  tools/testing/selftests/x86/sigreturn.c           | 7 +++----
  tools/testing/selftests/x86/single_step_syscall.c | 4 ++--
  tools/testing/selftests/x86/syscall_arg_fault.c   | 7 +++----
  4 files changed, 10 insertions(+), 12 deletions(-)

diff --git a/tools/testing/selftests/x86/mov_ss_trap.c b/tools/testing/selftests/x86/mov_ss_trap.c
index 6da0ac3f0135..cc3de6ff9fba 100644
--- a/tools/testing/selftests/x86/mov_ss_trap.c
+++ b/tools/testing/selftests/x86/mov_ss_trap.c
@@ -47,7 +47,6 @@
  unsigned short ss;
  extern unsigned char breakpoint_insn[];
  sigjmp_buf jmpbuf;
-static unsigned char altstack_data[SIGSTKSZ];
static void enable_watchpoint(void)
  {
@@ -250,13 +249,14 @@ int main()
  	if (sigsetjmp(jmpbuf, 1) == 0) {
  		printf("[RUN]\tMOV SS; SYSENTER\n");
  		stack_t stack = {
-			.ss_sp = altstack_data,
+			.ss_sp = malloc(sizeof(char) * SIGSTKSZ),
  			.ss_size = SIGSTKSZ,
  		};
  		if (sigaltstack(&stack, NULL) != 0)
  			err(1, "sigaltstack");
  		sethandler(SIGSEGV, handle_and_longjmp, SA_RESETHAND | SA_ONSTACK);
  		nr = SYS_getpid;
+		free(stack.ss_sp);
  		/* Clear EBP first to make sure we segfault cleanly. */
  		asm volatile ("xorl %%ebp, %%ebp; mov %[ss], %%ss; SYSENTER" : "+a" (nr)
  			      : [ss] "m" (ss) : "flags", "rcx"
diff --git a/tools/testing/selftests/x86/sigreturn.c b/tools/testing/selftests/x86/sigreturn.c
index 57c4f67f16ef..5d7961a5f7f6 100644
--- a/tools/testing/selftests/x86/sigreturn.c
+++ b/tools/testing/selftests/x86/sigreturn.c
@@ -138,9 +138,6 @@ static unsigned short LDT3(int idx)
  	return (idx << 3) | 7;
  }
-/* Our sigaltstack scratch space. */
-static char altstack_data[SIGSTKSZ];
-
  static void sethandler(int sig, void (*handler)(int, siginfo_t *, void *),
  		       int flags)
  {
@@ -771,7 +768,8 @@ int main()
  	setup_ldt();
stack_t stack = {
-		.ss_sp = altstack_data,
+		/* Our sigaltstack scratch space. */
+		.ss_sp = malloc(sizeof(char) * SIGSTKSZ),
  		.ss_size = SIGSTKSZ,
  	};
  	if (sigaltstack(&stack, NULL) != 0)
@@ -872,5 +870,6 @@ int main()
  	total_nerrs += test_nonstrict_ss();
  #endif
+ free(stack.ss_sp);
  	return total_nerrs ? 1 : 0;
  }
diff --git a/tools/testing/selftests/x86/single_step_syscall.c b/tools/testing/selftests/x86/single_step_syscall.c
index 120ac741fe44..9a30f443e928 100644
--- a/tools/testing/selftests/x86/single_step_syscall.c
+++ b/tools/testing/selftests/x86/single_step_syscall.c
@@ -57,7 +57,6 @@ static void clearhandler(int sig)
static volatile sig_atomic_t sig_traps, sig_eflags;
  sigjmp_buf jmpbuf;
-static unsigned char altstack_data[SIGSTKSZ];
#ifdef __x86_64__
  # define REG_IP REG_RIP
@@ -210,7 +209,7 @@ int main()
  		unsigned long nr = SYS_getpid;
  		printf("[RUN]\tSet TF and check SYSENTER\n");
  		stack_t stack = {
-			.ss_sp = altstack_data,
+			.ss_sp = malloc(sizeof(char) * SIGSTKSZ),
  			.ss_size = SIGSTKSZ,
  		};
  		if (sigaltstack(&stack, NULL) != 0)
@@ -219,6 +218,7 @@ int main()
  			   SA_RESETHAND | SA_ONSTACK);
  		sethandler(SIGILL, print_and_longjmp, SA_RESETHAND);
  		set_eflags(get_eflags() | X86_EFLAGS_TF);
+		free(stack.ss_sp);
  		/* Clear EBP first to make sure we segfault cleanly. */
  		asm volatile ("xorl %%ebp, %%ebp; SYSENTER" : "+a" (nr) :: "flags", "rcx"
  #ifdef __x86_64__
diff --git a/tools/testing/selftests/x86/syscall_arg_fault.c b/tools/testing/selftests/x86/syscall_arg_fault.c
index bff474b5efc6..461fa41a4d02 100644
--- a/tools/testing/selftests/x86/syscall_arg_fault.c
+++ b/tools/testing/selftests/x86/syscall_arg_fault.c
@@ -17,9 +17,6 @@
#include "helpers.h" -/* Our sigaltstack scratch space. */
-static unsigned char altstack_data[SIGSTKSZ];
-
  static void sethandler(int sig, void (*handler)(int, siginfo_t *, void *),
  		       int flags)
  {
@@ -104,7 +101,8 @@ static void sigill(int sig, siginfo_t *info, void *ctx_void)
  int main()
  {
  	stack_t stack = {
-		.ss_sp = altstack_data,
+		/* Our sigaltstack scratch space. */
+		.ss_sp = malloc(sizeof(char) * SIGSTKSZ),
  		.ss_size = SIGSTKSZ,
  	};
  	if (sigaltstack(&stack, NULL) != 0)
@@ -233,5 +231,6 @@ int main()
  	set_eflags(get_eflags() & ~X86_EFLAGS_TF);
  #endif
+ free(stack.ss_sp);
  	return 0;
  }



[Index of Archives]     [Linux Wireless]     [Linux Kernel]     [ATH6KL]     [Linux Bluetooth]     [Linux Netdev]     [Kernel Newbies]     [Share Photos]     [IDE]     [Security]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux ATA RAID]     [Samba]     [Device Mapper]

  Powered by Linux