Blob Blame History Raw
diff -upr libcgroup-0.40.rc1.orig/src/api.c libcgroup-0.40.rc1/src/api.c
--- libcgroup-0.40.rc1.orig/src/api.c	2013-09-16 10:34:32.542272000 +0200
+++ libcgroup-0.40.rc1/src/api.c	2013-09-13 16:07:10.000000000 +0200
@@ -2237,29 +2237,29 @@ static int cg_rd_ctrl_file(const char *s
 					const char *file, char **value)
 {
 	char path[FILENAME_MAX];
-	FILE *ctrl_file = NULL;
-	int ret;
+	int ctrl_file = -1;
+	ssize_t ret;
 
 	if (!cg_build_path_locked(cgroup, path, subsys))
 		return ECGFAIL;
 
 	strncat(path, file, sizeof(path) - strlen(path));
-	ctrl_file = fopen(path, "re");
-	if (!ctrl_file)
+	ctrl_file = open(path, O_RDONLY | O_CLOEXEC);
+	if (ctrl_file < 0)
 		return ECGROUPVALUENOTEXIST;
 
 	*value = calloc(CG_VALUE_MAX, 1);
 	if (!*value) {
-		fclose(ctrl_file);
+		close(ctrl_file);
 		last_errno = errno;
 		return ECGOTHER;
 	}
 
 	/*
-	 * using %as crashes when we try to read from files like
+	 * using %as or fread crashes when we try to read from files like
 	 * memory.stat
 	 */
-	ret = fread(*value, 1, CG_VALUE_MAX-1, ctrl_file);
+	ret = read(ctrl_file, *value, CG_VALUE_MAX-1);
 	if (ret < 0) {
 		free(*value);
 		*value = NULL;
@@ -2269,7 +2269,7 @@ static int cg_rd_ctrl_file(const char *s
 			(*value)[ret-1] = '\0';
 	}
 
-	fclose(ctrl_file);
+	close(ctrl_file);
 
 	return 0;
 }