forked from torvalds/linux
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
kselftest: arm64: fake_sigreturn_duplicated_fpsimd
Add a simple fake_sigreturn testcase which builds a ucontext_t with an anomalous additional fpsimd_context and place it onto the stack. Expects a SIGSEGV on test PASS. Reviewed-by: Dave Martin <[email protected]> Signed-off-by: Cristian Marussi <[email protected]> Signed-off-by: Catalin Marinas <[email protected]>
- Loading branch information
Showing
1 changed file
with
50 additions
and
0 deletions.
There are no files selected for viewing
50 changes: 50 additions & 0 deletions
50
tools/testing/selftests/arm64/signal/testcases/fake_sigreturn_duplicated_fpsimd.c
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,50 @@ | ||
// SPDX-License-Identifier: GPL-2.0 | ||
/* | ||
* Copyright (C) 2019 ARM Limited | ||
* | ||
* Place a fake sigframe on the stack including an additional FPSIMD | ||
* record: on sigreturn Kernel must spot this attempt and the test | ||
* case is expected to be terminated via SEGV. | ||
*/ | ||
|
||
#include <signal.h> | ||
#include <ucontext.h> | ||
|
||
#include "test_signals_utils.h" | ||
#include "testcases.h" | ||
|
||
struct fake_sigframe sf; | ||
|
||
static int fake_sigreturn_duplicated_fpsimd_run(struct tdescr *td, | ||
siginfo_t *si, ucontext_t *uc) | ||
{ | ||
struct _aarch64_ctx *shead = GET_SF_RESV_HEAD(sf), *head; | ||
|
||
/* just to fill the ucontext_t with something real */ | ||
if (!get_current_context(td, &sf.uc)) | ||
return 1; | ||
|
||
head = get_starting_head(shead, sizeof(struct fpsimd_context) + HDR_SZ, | ||
GET_SF_RESV_SIZE(sf), NULL); | ||
if (!head) | ||
return 0; | ||
|
||
/* Add a spurious fpsimd_context */ | ||
head->magic = FPSIMD_MAGIC; | ||
head->size = sizeof(struct fpsimd_context); | ||
/* and terminate */ | ||
write_terminator_record(GET_RESV_NEXT_HEAD(head)); | ||
|
||
ASSERT_BAD_CONTEXT(&sf.uc); | ||
fake_sigreturn(&sf, sizeof(sf), 0); | ||
|
||
return 1; | ||
} | ||
|
||
struct tdescr tde = { | ||
.name = "FAKE_SIGRETURN_DUPLICATED_FPSIMD", | ||
.descr = "Triggers a sigreturn including two fpsimd_context", | ||
.sig_ok = SIGSEGV, | ||
.timeout = 3, | ||
.run = fake_sigreturn_duplicated_fpsimd_run, | ||
}; |