mirror of
https://github.com/checkpoint-restore/criu
synced 2025-09-01 14:55:39 +00:00
cr-restore: fix error handling and memory leak in read_vma
CID 996203 (#1 of 1): Resource leak (RESOURCE_LEAK) 15. leaked_storage: Variable "vma" going out of scope leaks the storage it points to. Signed-off-by: Andrey Vagin <avagin@openvz.org> Signed-off-by: Pavel Emelyanov <xemul@parallels.com>
This commit is contained in:
committed by
Pavel Emelyanov
parent
c9c1ec7b44
commit
510b0dacb4
21
cr-restore.c
21
cr-restore.c
@@ -445,28 +445,33 @@ static int read_vmas(int pid)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
ret = pb_read_one_eof(fd, &e, PB_VMAS);
|
ret = pb_read_one_eof(fd, &e, PB_VMAS);
|
||||||
if (ret <= 0)
|
if (ret <= 0) {
|
||||||
|
xfree(vma);
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
rst_vmas.nr++;
|
rst_vmas.nr++;
|
||||||
list_add_tail(&vma->list, &rst_vmas.h);
|
list_add_tail(&vma->list, &rst_vmas.h);
|
||||||
|
|
||||||
if (e->fd != -1) {
|
|
||||||
ret = -1;
|
|
||||||
pr_err("Error in vma->fd setting (%Ld)\n",
|
|
||||||
(unsigned long long)e->fd);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
vma->vma = *e;
|
vma->vma = *e;
|
||||||
vma_entry__free_unpacked(e, NULL);
|
vma_entry__free_unpacked(e, NULL);
|
||||||
|
|
||||||
|
if (vma->vma.fd != -1) {
|
||||||
|
ret = -1;
|
||||||
|
pr_err("Error in vma->fd setting (%Ld)\n",
|
||||||
|
(unsigned long long)vma->vma.fd);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
if (!vma_priv(&vma->vma))
|
if (!vma_priv(&vma->vma))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
priv_size += vma_area_len(vma);
|
priv_size += vma_area_len(vma);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (ret < 0)
|
||||||
|
goto out;
|
||||||
|
|
||||||
/* 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, priv_size, PROT_NONE, MAP_PRIVATE | MAP_ANONYMOUS, 0, 0);
|
addr = mmap(NULL, priv_size, PROT_NONE, MAP_PRIVATE | MAP_ANONYMOUS, 0, 0);
|
||||||
if (addr == MAP_FAILED) {
|
if (addr == MAP_FAILED) {
|
||||||
|
Reference in New Issue
Block a user