2021-08-24 02:46:39

by Jun Miao

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

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 <[email protected]>
Signed-off-by: Jun Miao <[email protected]>
---
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;
}
--
2.32.0


2021-09-02 10:00:46

by Jun Miao

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

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 <[email protected]>
> Signed-off-by: Jun Miao <[email protected]>
> ---
> 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;
> }

2021-09-02 21:11:37

by Shuah Khan

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

On 9/2/21 2:45 AM, Jun Miao wrote:
> 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:
>>

Please don't top post.

It is applied to linux-kselftest next for Linux 5.15-rc1

https://git.kernel.org/pub/scm/linux/kernel/git/shuah/linux-kselftest.git/log/?h=next

thanks,
-- Shuah