mirror of
https://github.com/checkpoint-restore/criu
synced 2025-09-04 00:05:26 +00:00
sanitize vma types parsing
Signed-off-by: Pavel Emelyanov <xemul@parallels.com>
This commit is contained in:
54
cr-dump.c
54
cr-dump.c
@@ -434,42 +434,36 @@ static int dump_task_mappings(pid_t pid, struct list_head *vma_area_list, struct
|
|||||||
|
|
||||||
pr_info_vma(vma_area);
|
pr_info_vma(vma_area);
|
||||||
|
|
||||||
if (vma->flags & (MAP_SHARED | MAP_PRIVATE)) {
|
if (vma_entry_is(vma, VMA_ANON_SHARED)) {
|
||||||
|
struct shmem_entry e;
|
||||||
|
|
||||||
if (vma_entry_is(vma, VMA_ANON_SHARED)) {
|
e.start = vma->start;
|
||||||
struct shmem_entry e;
|
e.end = vma->end;
|
||||||
|
e.shmid = vma_area->shmid;
|
||||||
|
|
||||||
e.start = vma->start;
|
pr_info("shmem: s: %16lx e: %16lx shmid: %16lx\n",
|
||||||
e.end = vma->end;
|
|
||||||
e.shmid = vma_area->shmid;
|
|
||||||
|
|
||||||
pr_info("shmem: s: %16lx e: %16lx shmid: %16lx\n",
|
|
||||||
e.start, e.end, e.shmid);
|
e.start, e.end, e.shmid);
|
||||||
|
|
||||||
if (write_img(cr_fdset->fds[CR_FD_SHMEM], &e))
|
if (write_img(cr_fdset->fds[CR_FD_SHMEM], &e))
|
||||||
goto err;
|
goto err;
|
||||||
} else if (vma_entry_is(vma, VMA_FILE_PRIVATE) ||
|
} else if (vma_entry_is(vma, VMA_FILE_PRIVATE) ||
|
||||||
vma_entry_is(vma, VMA_FILE_SHARED)) {
|
vma_entry_is(vma, VMA_FILE_SHARED)) {
|
||||||
struct fd_parms p = {
|
struct fd_parms p = {
|
||||||
.fd_name = vma->start,
|
.fd_name = vma->start,
|
||||||
.id = FD_ID_INVALID,
|
.id = FD_ID_INVALID,
|
||||||
.pid = pid,
|
.pid = pid,
|
||||||
.type = FDINFO_MAP,
|
.type = FDINFO_MAP,
|
||||||
};
|
};
|
||||||
|
|
||||||
if (vma->prot & PROT_WRITE &&
|
if (vma->prot & PROT_WRITE &&
|
||||||
vma_entry_is(vma, VMA_FILE_SHARED))
|
vma_entry_is(vma, VMA_FILE_SHARED))
|
||||||
p.flags = O_RDWR;
|
p.flags = O_RDWR;
|
||||||
else
|
else
|
||||||
p.flags = O_RDONLY;
|
p.flags = O_RDONLY;
|
||||||
|
|
||||||
ret = dump_one_reg_file(&p, vma_area->vm_file_fd, cr_fdset, 0);
|
ret = dump_one_reg_file(&p, vma_area->vm_file_fd, cr_fdset, 0);
|
||||||
if (ret)
|
if (ret)
|
||||||
goto err;
|
goto err;
|
||||||
}
|
|
||||||
} else {
|
|
||||||
pr_err("Unknown VMA (pid: %d)\n", pid);
|
|
||||||
goto err;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -93,6 +93,10 @@ int parse_maps(pid_t pid, struct list_head *vma_area_list, bool use_map_files)
|
|||||||
vma_area->vma.flags = MAP_SHARED;
|
vma_area->vma.flags = MAP_SHARED;
|
||||||
else if (s == 'p')
|
else if (s == 'p')
|
||||||
vma_area->vma.flags = MAP_PRIVATE;
|
vma_area->vma.flags = MAP_PRIVATE;
|
||||||
|
else {
|
||||||
|
pr_err("Unexpected VMA met (%c)\n", s);
|
||||||
|
goto err;
|
||||||
|
}
|
||||||
|
|
||||||
if (strstr(big_buffer, "[stack]")) {
|
if (strstr(big_buffer, "[stack]")) {
|
||||||
vma_area->vma.status |= VMA_AREA_REGULAR | VMA_AREA_STACK;
|
vma_area->vma.status |= VMA_AREA_REGULAR | VMA_AREA_STACK;
|
||||||
|
Reference in New Issue
Block a user