2
0
mirror of https://github.com/checkpoint-restore/criu synced 2025-08-22 09:58:09 +00:00

cr-restore: rseq: use glibc-specific way to unregister only as fallback

Let's use dynamic approach to detect built-in *libc rseq in all cases,
and "old" static approach as a fallback path if the user kernel
lacks support of ptrace_get_rseq_conf feature.

Suggested-by: Florian Weimer <fweimer@redhat.com>
Signed-off-by: Alexander Mikhalitsyn <alexander.mikhalitsyn@virtuozzo.com>
This commit is contained in:
Alexander Mikhalitsyn 2022-07-20 15:17:35 +03:00 committed by Andrei Vagin
parent cacddf19da
commit f7972a3f04

View File

@ -3088,7 +3088,6 @@ static int prep_rseq(struct rst_rseq_param *rseq, ThreadCoreEntry *tc)
return 0; return 0;
} }
#if defined(__GLIBC__) && defined(RSEQ_SIG)
static void prep_libc_rseq_info(struct rst_rseq_param *rseq) static void prep_libc_rseq_info(struct rst_rseq_param *rseq)
{ {
if (!kdat.has_rseq) { if (!kdat.has_rseq) {
@ -3096,15 +3095,14 @@ static void prep_libc_rseq_info(struct rst_rseq_param *rseq)
return; return;
} }
if (!kdat.has_ptrace_get_rseq_conf) {
#if defined(__GLIBC__) && defined(RSEQ_SIG)
rseq->rseq_abi_pointer = encode_pointer(__criu_thread_pointer() + __rseq_offset); rseq->rseq_abi_pointer = encode_pointer(__criu_thread_pointer() + __rseq_offset);
rseq->rseq_abi_size = __rseq_size; rseq->rseq_abi_size = __rseq_size;
rseq->signature = RSEQ_SIG; rseq->signature = RSEQ_SIG;
}
#else #else
static void prep_libc_rseq_info(struct rst_rseq_param *rseq)
{
if (!kdat.has_rseq || !kdat.has_ptrace_get_rseq_conf) {
rseq->rseq_abi_pointer = 0; rseq->rseq_abi_pointer = 0;
#endif
return; return;
} }
@ -3112,7 +3110,6 @@ static void prep_libc_rseq_info(struct rst_rseq_param *rseq)
rseq->rseq_abi_size = kdat.libc_rseq_conf.rseq_abi_size; rseq->rseq_abi_size = kdat.libc_rseq_conf.rseq_abi_size;
rseq->signature = kdat.libc_rseq_conf.signature; rseq->signature = kdat.libc_rseq_conf.signature;
} }
#endif
static rlim_t decode_rlim(rlim_t ival) static rlim_t decode_rlim(rlim_t ival)
{ {