]> git.ipfire.org Git - thirdparty/libcgroup.git/commitdiff
Fix reading of empty parameter values
authorJan Safranek <jsafrane@redhat.com>
Tue, 22 Dec 2009 08:16:48 +0000 (09:16 +0100)
committerJan Safranek <jsafrane@redhat.com>
Tue, 22 Dec 2009 08:16:48 +0000 (09:16 +0100)
When a group parameter has empty value (like uninitialized cpuset.cpus),
libcgroup does not return this parameter value - it returns
ECGROUPVALUENOTEXIST instead.

I think reading whole parameter file instead of just '%s' is the right thing
to do - it helps also with multiline values, like cpuacct.stat.

Signed-off-by: Jan Safranek <jsafrane@redhat.com>
src/api.c

index 8cb3dcc6e3a4e9577323517d6c8590034efa9739..863df33e99aaf30f7310c57739872f6d5063c46b 100644 (file)
--- a/src/api.c
+++ b/src/api.c
@@ -1775,7 +1775,7 @@ static int cg_rd_ctrl_file(char *subsys, char *cgroup, char *file, char **value)
        if (!ctrl_file)
                return ECGROUPVALUENOTEXIST;
 
-       *value = malloc(CG_VALUE_MAX);
+       *value = calloc(CG_VALUE_MAX, 1);
        if (!*value) {
                last_errno = errno;
                return ECGOTHER;
@@ -1785,10 +1785,14 @@ static int cg_rd_ctrl_file(char *subsys, char *cgroup, char *file, char **value)
         * using %as crashes when we try to read from files like
         * memory.stat
         */
-       ret = fscanf(ctrl_file, "%s", *value);
-       if (ret == 0 || ret == EOF) {
+       ret = fread(*value, 1, CG_VALUE_MAX-1, ctrl_file);
+       if (ret < 0) {
                free(*value);
                *value = NULL;
+       } else {
+               /* remove trailing \n */
+               if (ret > 0 && (*value)[ret-1] == '\n')
+                       (*value)[ret-1] = '\0';
        }
 
        fclose(ctrl_file);