mirror of
https://git.proxmox.com/git/mirror_lxc
synced 2025-08-14 11:39:56 +00:00
cgmanager get/set: clean up child (v2)
(Thanks, Dwight, this one look right?) Make sure we reap our child at cgm_{s,g}et. Changelog: Fix change in behavior on empty read from the do_cgm_get() helper that was spotted by Dwight. Signed-off-by: Serge Hallyn <serge.hallyn@ubuntu.com> Acked-by: Dwight Engen <dwight.engen@oracle.com>
This commit is contained in:
parent
1c1bb85ad2
commit
9e43c35232
@ -794,32 +794,38 @@ static int cgm_get(const char *filename, char *value, size_t len, const char *na
|
|||||||
close(p[1]);
|
close(p[1]);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
if (!pid)
|
if (!pid) // do_cgm_get exits
|
||||||
do_cgm_get(name, lxcpath, filename, p[1], len && value);
|
do_cgm_get(name, lxcpath, filename, p[1], len && value);
|
||||||
close(p[1]);
|
close(p[1]);
|
||||||
ret = read(p[0], &newlen, sizeof(newlen));
|
ret = read(p[0], &newlen, sizeof(newlen));
|
||||||
if (ret != sizeof(newlen)) {
|
if (ret != sizeof(newlen)) {
|
||||||
close(p[0]);
|
close(p[0]);
|
||||||
return -1;
|
ret = -1;
|
||||||
|
goto out;
|
||||||
}
|
}
|
||||||
if (!len || !value) {
|
if (!len || !value) {
|
||||||
close(p[0]);
|
close(p[0]);
|
||||||
return newlen;
|
ret = newlen;
|
||||||
|
goto out;
|
||||||
}
|
}
|
||||||
memset(value, 0, len);
|
memset(value, 0, len);
|
||||||
if (newlen < 0) { // child is reporting an error
|
if (newlen < 0) { // child is reporting an error
|
||||||
close(p[0]);
|
close(p[0]);
|
||||||
return -1;
|
ret = -1;
|
||||||
|
goto out;
|
||||||
}
|
}
|
||||||
if (newlen == 0) { // empty read
|
if (newlen == 0) { // empty read
|
||||||
close(p[0]);
|
close(p[0]);
|
||||||
return 0;
|
ret = 0;
|
||||||
|
goto out;
|
||||||
}
|
}
|
||||||
readlen = newlen > len ? len : newlen;
|
readlen = newlen > len ? len : newlen;
|
||||||
ret = read(p[0], value, readlen);
|
ret = read(p[0], value, readlen);
|
||||||
close(p[0]);
|
close(p[0]);
|
||||||
if (ret != readlen)
|
if (ret != readlen) {
|
||||||
return -1;
|
ret = -1;
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
if (newlen >= len) {
|
if (newlen >= len) {
|
||||||
value[len-1] = '\0';
|
value[len-1] = '\0';
|
||||||
newlen = len-1;
|
newlen = len-1;
|
||||||
@ -828,7 +834,11 @@ static int cgm_get(const char *filename, char *value, size_t len, const char *na
|
|||||||
value[newlen++] = '\n';
|
value[newlen++] = '\n';
|
||||||
value[newlen] = '\0';
|
value[newlen] = '\0';
|
||||||
}
|
}
|
||||||
return newlen;
|
ret = newlen;
|
||||||
|
out:
|
||||||
|
if (wait_for_pid(pid))
|
||||||
|
WARN("do_cgm_get exited with error");
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void do_cgm_set(const char *name, const char *lxcpath, const char *filename, const char *value, int outp)
|
static void do_cgm_set(const char *name, const char *lxcpath, const char *filename, const char *value, int outp)
|
||||||
@ -920,11 +930,13 @@ static int cgm_set(const char *filename, const char *value, const char *name, co
|
|||||||
close(p[0]);
|
close(p[0]);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
if (!pid)
|
if (!pid) // do_cgm_set exits
|
||||||
do_cgm_set(name, lxcpath, filename, value, p[1]);
|
do_cgm_set(name, lxcpath, filename, value, p[1]);
|
||||||
close(p[1]);
|
close(p[1]);
|
||||||
ret = read(p[0], &v, sizeof(v));
|
ret = read(p[0], &v, sizeof(v));
|
||||||
close(p[0]);
|
close(p[0]);
|
||||||
|
if (wait_for_pid(pid))
|
||||||
|
WARN("do_cgm_set exited with error");
|
||||||
if (ret != sizeof(v) || !v)
|
if (ret != sizeof(v) || !v)
|
||||||
return -1;
|
return -1;
|
||||||
return 0;
|
return 0;
|
||||||
|
Loading…
Reference in New Issue
Block a user