Commit 6012b820 authored by Mark Brown's avatar Mark Brown Committed by Catalin Marinas

kselftest/arm64: Copy whole EXTRA context

When copying the EXTRA context our calculation of the amount of data we
need to copy is incorrect, we only calculate the amount of data needed
within uc_mcontext.__reserved, not taking account of the fixed portion
of the context. Add in the offset of the reserved data so that we copy
everything we should.

This will only cause test failures in cases where the last context in the
EXTRA context is smaller than the missing data since we don't currently
validate any of the register data and all the buffers we copy into are
statically allocated so default to zero meaning that if we walk beyond the
end of what we copied we'll encounter what looks like a context with magic
and length both 0 which is a valid terminator record.
Signed-off-by: default avatarMark Brown <broonie@kernel.org>
Link: https://lore.kernel.org/r/20230201-arm64-kselftest-full-extra-v1-1-93741f32dd29@kernel.orgSigned-off-by: default avatarCatalin Marinas <catalin.marinas@arm.com>
parent a7db82f1
...@@ -192,8 +192,10 @@ static bool handle_signal_copyctx(struct tdescr *td, ...@@ -192,8 +192,10 @@ static bool handle_signal_copyctx(struct tdescr *td,
* in the copy, this was previously validated in * in the copy, this was previously validated in
* ASSERT_GOOD_CONTEXT(). * ASSERT_GOOD_CONTEXT().
*/ */
to_copy = offset + sizeof(struct extra_context) + 16 + to_copy = __builtin_offsetof(ucontext_t,
extra->size; uc_mcontext.__reserved);
to_copy += offset + sizeof(struct extra_context) + 16;
to_copy += extra->size;
copied_extra = (struct extra_context *)&(td->live_uc->uc_mcontext.__reserved[offset]); copied_extra = (struct extra_context *)&(td->live_uc->uc_mcontext.__reserved[offset]);
} else { } else {
copied_extra = NULL; copied_extra = NULL;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment