rseq: Use pr_warn_once() when deprecated/unknown ABI flags are encountered
These commits use WARN_ON_ONCE() and kill the offending processes when deprecated and unknown flags are encountered: commitc17a6ff932
("rseq: Kill process when unknown flags are encountered in ABI structures") commit0190e4198e
("rseq: Deprecate RSEQ_CS_FLAG_NO_RESTART_ON_* flags") The WARN_ON_ONCE() triggered by userspace input prevents use of Syzkaller to fuzz the rseq system call. Replace this WARN_ON_ONCE() by pr_warn_once() messages which contain actually useful information. Reported-by: Mark Rutland <mark.rutland@arm.com> Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com> Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org> Acked-by: Mark Rutland <mark.rutland@arm.com> Acked-by: Paul E. McKenney <paulmck@kernel.org> Link: https://lkml.kernel.org/r/20221102130635.7379-1-mathieu.desnoyers@efficios.com
This commit is contained in:
parent
094226ad94
commit
448dca8c88
|
@ -171,12 +171,27 @@ static int rseq_get_rseq_cs(struct task_struct *t, struct rseq_cs *rseq_cs)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static bool rseq_warn_flags(const char *str, u32 flags)
|
||||
{
|
||||
u32 test_flags;
|
||||
|
||||
if (!flags)
|
||||
return false;
|
||||
test_flags = flags & RSEQ_CS_NO_RESTART_FLAGS;
|
||||
if (test_flags)
|
||||
pr_warn_once("Deprecated flags (%u) in %s ABI structure", test_flags, str);
|
||||
test_flags = flags & ~RSEQ_CS_NO_RESTART_FLAGS;
|
||||
if (test_flags)
|
||||
pr_warn_once("Unknown flags (%u) in %s ABI structure", test_flags, str);
|
||||
return true;
|
||||
}
|
||||
|
||||
static int rseq_need_restart(struct task_struct *t, u32 cs_flags)
|
||||
{
|
||||
u32 flags, event_mask;
|
||||
int ret;
|
||||
|
||||
if (WARN_ON_ONCE(cs_flags & RSEQ_CS_NO_RESTART_FLAGS) || cs_flags)
|
||||
if (rseq_warn_flags("rseq_cs", cs_flags))
|
||||
return -EINVAL;
|
||||
|
||||
/* Get thread flags. */
|
||||
|
@ -184,7 +199,7 @@ static int rseq_need_restart(struct task_struct *t, u32 cs_flags)
|
|||
if (ret)
|
||||
return ret;
|
||||
|
||||
if (WARN_ON_ONCE(flags & RSEQ_CS_NO_RESTART_FLAGS) || flags)
|
||||
if (rseq_warn_flags("rseq", flags))
|
||||
return -EINVAL;
|
||||
|
||||
/*
|
||||
|
|
Loading…
Reference in New Issue