2
0
mirror of https://github.com/checkpoint-restore/criu synced 2025-08-29 13:28:27 +00:00

criu: shstk: add VMA_AREA_SHSTK flag

The shadow stack VMAs require special care because they can only be
created and populated using special system calls.

Add VMA_AREA_SHSTK flag and set it for VMAs that are marked as "ss" in
/proc/pid/smaps

Signed-off-by: Mike Rapoport (IBM) <rppt@kernel.org>
This commit is contained in:
Mike Rapoport (IBM) 2022-05-15 21:19:58 +03:00 committed by Andrei Vagin
parent a09a0eb081
commit dbab276601
3 changed files with 18 additions and 3 deletions

View File

@ -35,6 +35,8 @@
* - stack
* the memory area is used in application stack so we
* should be careful about guard page here
* - shadow stack
* the memory area is used by shadow stack
* - vsyscall
* special memory area injected into the task memory
* space by the kernel itself, represent virtual syscall
@ -84,6 +86,7 @@
#define VMA_AREA_VVAR (1 << 12)
#define VMA_AREA_AIORING (1 << 13)
#define VMA_AREA_MEMFD (1 << 14)
#define VMA_AREA_SHSTK (1 << 15)
#define VMA_EXT_PLUGIN (1 << 27)
#define VMA_CLOSE (1 << 28)

View File

@ -118,7 +118,8 @@ bool handle_vma_plugin(int *fd, struct stat *stat)
return true;
}
static void __parse_vmflags(char *buf, u32 *flags, u64 *madv, int *io_pf)
static void __parse_vmflags(char *buf, u32 *flags, u64 *madv, int *io_pf,
int *shstk)
{
char *tok;
@ -162,6 +163,9 @@ static void __parse_vmflags(char *buf, u32 *flags, u64 *madv, int *io_pf)
if (_vmflag_match(tok, "io") || _vmflag_match(tok, "pf"))
*io_pf = 1;
if (_vmflag_match(tok, "ss"))
*shstk = 1;
/*
* Anything else is just ignored.
*/
@ -172,14 +176,21 @@ static void __parse_vmflags(char *buf, u32 *flags, u64 *madv, int *io_pf)
void parse_vmflags(char *buf, u32 *flags, u64 *madv, int *io_pf)
{
__parse_vmflags(buf, flags, madv, io_pf);
int shstk = 0;
__parse_vmflags(buf, flags, madv, io_pf, &shstk);
}
static void parse_vma_vmflags(char *buf, struct vma_area *vma_area)
{
int io_pf = 0;
int shstk = 0;
__parse_vmflags(buf, &vma_area->e->flags, &vma_area->e->madv, &io_pf);
__parse_vmflags(buf, &vma_area->e->flags, &vma_area->e->madv, &io_pf,
&shstk);
if (shstk)
vma_area->e->status |= VMA_AREA_SHSTK;
/*
* vmsplice doesn't work for VM_IO and VM_PFNMAP mappings, the

View File

@ -103,6 +103,7 @@ mmap_status_map = [
('VMA_AREA_VVAR', 1 << 12),
('VMA_AREA_AIORING', 1 << 13),
('VMA_AREA_MEMFD', 1 << 14),
('VMA_AREA_SHSTK', 1 << 15),
('VMA_UNSUPP', 1 << 31),
]