Commit 131d4b86 authored by Pavel Emelyanov's avatar Pavel Emelyanov

mem: Sanitize error path in prepare_mappings()

Signed-off-by: 's avatarPavel Emelyanov <xemul@parallels.com>
parent fce8cac1
...@@ -534,8 +534,9 @@ static int prepare_mappings(int pid) ...@@ -534,8 +534,9 @@ static int prepare_mappings(int pid)
/* Reserve a place for mapping private vma-s one by one */ /* Reserve a place for mapping private vma-s one by one */
addr = mmap(NULL, vmas->priv_size, PROT_NONE, MAP_PRIVATE | MAP_ANONYMOUS, 0, 0); addr = mmap(NULL, vmas->priv_size, PROT_NONE, MAP_PRIVATE | MAP_ANONYMOUS, 0, 0);
if (addr == MAP_FAILED) { if (addr == MAP_FAILED) {
ret = -1;
pr_perror("Unable to reserve memory (%lu bytes)", vmas->priv_size); pr_perror("Unable to reserve memory (%lu bytes)", vmas->priv_size);
return -1; goto out;
} }
old_premmapped_addr = rsti(current)->premmapped_addr; old_premmapped_addr = rsti(current)->premmapped_addr;
...@@ -544,18 +545,21 @@ static int prepare_mappings(int pid) ...@@ -544,18 +545,21 @@ static int prepare_mappings(int pid)
rsti(current)->premmapped_len = vmas->priv_size; rsti(current)->premmapped_len = vmas->priv_size;
ret = premap_priv_vmas(pid, vmas, addr); ret = premap_priv_vmas(pid, vmas, addr);
if (ret == 0) if (ret < 0)
ret = restore_priv_vma_content(pid); goto out;
out: ret = restore_priv_vma_content(pid);
if (old_premmapped_addr && if (ret < 0)
munmap(old_premmapped_addr, old_premmapped_len)) { goto out;
pr_perror("Unable to unmap %p(%lx)",
old_premmapped_addr, old_premmapped_len);
return -1;
}
if (old_premmapped_addr) {
ret = munmap(old_premmapped_addr, old_premmapped_len);
if (ret < 0)
pr_perror("Unable to unmap %p(%lx)",
old_premmapped_addr, old_premmapped_len);
}
out:
return ret; return ret;
} }
......
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