1
1
mirror of https://github.com/systemd/systemd-stable.git synced 2025-01-26 10:03:40 +03:00

Do not realloc strings, which are already in the hashmap as keys

This prevents corruption of the hashmap, because we would free() the
keys in the hashmap, if the unit is already in there, with the same
cgroup path.
This commit is contained in:
Harald Hoyer 2013-08-28 15:33:35 +02:00
parent 3d040cf244
commit b58b8e11c5
2 changed files with 15 additions and 5 deletions

View File

@ -382,6 +382,7 @@ static CGroupControllerMask unit_get_siblings_mask(Unit *u) {
static int unit_create_cgroups(Unit *u, CGroupControllerMask mask) {
char *path = NULL;
int r;
bool is_in_hash = false;
assert(u);
@ -390,8 +391,14 @@ static int unit_create_cgroups(Unit *u, CGroupControllerMask mask) {
return -ENOMEM;
r = hashmap_put(u->manager->cgroup_unit, path, u);
if (r < 0)
if (r == 0)
is_in_hash = true;
if (r < 0) {
free(path);
log_error("cgroup %s exists already: %s", path, strerror(-r));
return r;
}
/* First, create our own group */
r = cg_create_with_mask(mask, path);
@ -405,9 +412,12 @@ static int unit_create_cgroups(Unit *u, CGroupControllerMask mask) {
log_error("Failed to migrate cgroup %s: %s", path, strerror(-r));
}
/* And remember the new data */
free(u->cgroup_path);
u->cgroup_path = path;
if (!is_in_hash) {
/* And remember the new data */
free(u->cgroup_path);
u->cgroup_path = path;
}
u->cgroup_realized = true;
u->cgroup_mask = mask;

View File

@ -2329,7 +2329,7 @@ int unit_deserialize(Unit *u, FILE *f, FDSet *fds) {
free(u->cgroup_path);
u->cgroup_path = s;
hashmap_put(u->manager->cgroup_unit, s, u);
assert(hashmap_put(u->manager->cgroup_unit, s, u) == 1);
continue;
}