Free map to avoid resource leak issues
1. There are some places which didn't free map as discovered by coverity. CID 289661 (#1 of 1): Resource leak (RESOURCE_LEAK)12. leaked_storage: Variable mapl going out of scope leaks the storage it points to. CID 289619 (#3 of 3): Resource leak (RESOURCE_LEAK)63. leaked_storage: Variable map going out of scope leaks the storage it points to. CID 289618 (#1 of 1): Resource leak (RESOURCE_LEAK)26. leaked_storage: Variable map going out of scope leaks the storage it points to. CID 289607 (#1 of 1): Resource leak (RESOURCE_LEAK)41. leaked_storage: Variable map going out of scope leaks the storage it points to. 2. If we call map_by_* inside a loop, then map_free should be called in the same loop, and it is better to set map to NULL after free. 3. And map_unlock is always called with map_lock, if we don't call map_remove before map_unlock, then the memory (allocated by map_lock -> map_read -> map_add -> xmalloc) could be leaked. So we need to free it in map_unlock as well. Signed-off-by: Guoqing Jiang <gqjiang@suse.com> Signed-off-by: Jes Sorensen <jsorensen@fb.com>
This commit is contained in:
parent
4a353e6ec4
commit
898bd1ecef
|
@ -1851,8 +1851,8 @@ try_again:
|
||||||
if (rv == 1 && !pre_exist)
|
if (rv == 1 && !pre_exist)
|
||||||
ioctl(mdfd, STOP_ARRAY, NULL);
|
ioctl(mdfd, STOP_ARRAY, NULL);
|
||||||
free(devices);
|
free(devices);
|
||||||
map_unlock(&map);
|
|
||||||
out:
|
out:
|
||||||
|
map_unlock(&map);
|
||||||
if (rv == 0) {
|
if (rv == 0) {
|
||||||
wait_for(chosen_name, mdfd);
|
wait_for(chosen_name, mdfd);
|
||||||
close(mdfd);
|
close(mdfd);
|
||||||
|
|
2
Detail.c
2
Detail.c
|
@ -263,6 +263,7 @@ int Detail(char *dev, struct context *c)
|
||||||
|
|
||||||
if (st->ss->export_detail_super)
|
if (st->ss->export_detail_super)
|
||||||
st->ss->export_detail_super(st);
|
st->ss->export_detail_super(st);
|
||||||
|
map_free(map);
|
||||||
} else {
|
} else {
|
||||||
struct map_ent *mp, *map = NULL;
|
struct map_ent *mp, *map = NULL;
|
||||||
char nbuf[64];
|
char nbuf[64];
|
||||||
|
@ -277,6 +278,7 @@ int Detail(char *dev, struct context *c)
|
||||||
print_escape(mp->path+8);
|
print_escape(mp->path+8);
|
||||||
putchar('\n');
|
putchar('\n');
|
||||||
}
|
}
|
||||||
|
map_free(map);
|
||||||
}
|
}
|
||||||
if (sra) {
|
if (sra) {
|
||||||
struct mdinfo *mdi;
|
struct mdinfo *mdi;
|
||||||
|
|
|
@ -1413,6 +1413,7 @@ restart:
|
||||||
sysfs_free(sra);
|
sysfs_free(sra);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
map_free(mapl);
|
||||||
return rv;
|
return rv;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1587,6 +1588,8 @@ static int Incremental_container(struct supertype *st, char *devname,
|
||||||
|
|
||||||
assemble_container_content(st, mdfd, ra, c,
|
assemble_container_content(st, mdfd, ra, c,
|
||||||
chosen_name, &result);
|
chosen_name, &result);
|
||||||
|
map_free(map);
|
||||||
|
map = NULL;
|
||||||
close(mdfd);
|
close(mdfd);
|
||||||
}
|
}
|
||||||
if (c->export && result) {
|
if (c->export && result) {
|
||||||
|
@ -1663,6 +1666,7 @@ static int Incremental_container(struct supertype *st, char *devname,
|
||||||
close(sfd);
|
close(sfd);
|
||||||
}
|
}
|
||||||
domain_free(domains);
|
domain_free(domains);
|
||||||
|
map_free(map);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
3
config.c
3
config.c
|
@ -181,9 +181,10 @@ struct mddev_dev *load_containers(void)
|
||||||
}
|
}
|
||||||
d->next = rv;
|
d->next = rv;
|
||||||
rv = d;
|
rv = d;
|
||||||
|
map_free(map);
|
||||||
|
map = NULL;
|
||||||
}
|
}
|
||||||
free_mdstat(mdstat);
|
free_mdstat(mdstat);
|
||||||
map_free(map);
|
|
||||||
|
|
||||||
return rv;
|
return rv;
|
||||||
}
|
}
|
||||||
|
|
|
@ -143,6 +143,8 @@ void map_unlock(struct map_ent **melp)
|
||||||
unlink(mapname[2]);
|
unlink(mapname[2]);
|
||||||
fclose(lf);
|
fclose(lf);
|
||||||
}
|
}
|
||||||
|
if (*melp)
|
||||||
|
map_free(*melp);
|
||||||
lf = NULL;
|
lf = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue