Blame SOURCES/libcgroup-0.41-increase-size-of-controller-values.patch

e09b92
diff --git a/src/api.c b/src/api.c
e09b92
index aa912b6..a98e829 100644
e09b92
--- a/src/api.c
e09b92
+++ b/src/api.c
e09b92
@@ -1592,7 +1592,7 @@ static int cgroup_copy_controller_values(struct cgroup_controller *dst,
e09b92
 		}
e09b92
 
e09b92
 		dst_val = dst->values[i];
e09b92
-		strncpy(dst_val->value, src_val->value, CG_VALUE_MAX);
e09b92
+		strncpy(dst_val->value, src_val->value, CG_CONTROL_VALUE_MAX);
e09b92
 		strncpy(dst_val->name, src_val->name, FILENAME_MAX);
e09b92
 		dst_val->dirty = src_val->dirty;
e09b92
 	}
e09b92
@@ -2317,7 +2317,7 @@ static int cg_rd_ctrl_file(const char *subsys, const char *cgroup,
e09b92
 	if (ctrl_file < 0)
e09b92
 		return ECGROUPVALUENOTEXIST;
e09b92
 
e09b92
-	*value = calloc(CG_VALUE_MAX, 1);
e09b92
+	*value = calloc(CG_CONTROL_VALUE_MAX, 1);
e09b92
 	if (!*value) {
e09b92
 		close(ctrl_file);
e09b92
 		last_errno = errno;
e09b92
@@ -2328,7 +2328,7 @@ static int cg_rd_ctrl_file(const char *subsys, const char *cgroup,
e09b92
 	 * using %as or fread crashes when we try to read from files like
e09b92
 	 * memory.stat
e09b92
 	 */
e09b92
-	ret = read(ctrl_file, *value, CG_VALUE_MAX-1);
e09b92
+	ret = read(ctrl_file, *value, CG_CONTROL_VALUE_MAX-1);
e09b92
 	if (ret < 0) {
e09b92
 		free(*value);
e09b92
 		*value = NULL;
e09b92
diff --git a/src/libcgroup-internal.h b/src/libcgroup-internal.h
e09b92
index c128788..7a761a5 100644
e09b92
--- a/src/libcgroup-internal.h
e09b92
+++ b/src/libcgroup-internal.h
e09b92
@@ -32,6 +32,9 @@ __BEGIN_DECLS
e09b92
 /* Estimated number of groups created */
e09b92
 #define MAX_GROUP_ELEMENTS	128
e09b92
 
e09b92
+/* Maximum length of a value */
e09b92
+#define CG_CONTROL_VALUE_MAX 4096
e09b92
+
e09b92
 #define CG_NV_MAX 100
e09b92
 #define CG_CONTROLLER_MAX 100
e09b92
 /* Max number of mounted hierarchies. Event if one controller is mounted per
e09b92
@@ -76,7 +79,7 @@ __BEGIN_DECLS
e09b92
 
e09b92
 struct control_value {
e09b92
 	char name[FILENAME_MAX];
e09b92
-	char value[CG_VALUE_MAX];
e09b92
+	char value[CG_CONTROL_VALUE_MAX];
e09b92
 	bool dirty;
e09b92
 };
e09b92
 
e09b92
diff --git a/src/tools/cgset.c b/src/tools/cgset.c
e09b92
index ea9f90d..3d3c8cc 100644
e09b92
--- a/src/tools/cgset.c
e09b92
+++ b/src/tools/cgset.c
e09b92
@@ -151,8 +151,8 @@ int main(int argc, char *argv[])
e09b92
 				goto err;
e09b92
 			}
e09b92
 
e09b92
-			strncpy(name_value[nv_number].value, buf, CG_VALUE_MAX);
e09b92
-			name_value[nv_number].value[CG_VALUE_MAX-1] = '\0';
e09b92
+			strncpy(name_value[nv_number].value, buf, CG_CONTROL_VALUE_MAX);
e09b92
+			name_value[nv_number].value[CG_CONTROL_VALUE_MAX-1] = '\0';
e09b92
 
e09b92
 			nv_number++;
e09b92
 			break;
e09b92
diff --git a/src/wrapper.c b/src/wrapper.c
e09b92
index 3a9331f..0fe80d0 100644
e09b92
--- a/src/wrapper.c
e09b92
+++ b/src/wrapper.c
e09b92
@@ -182,10 +182,10 @@ int cgroup_add_value_string(struct cgroup_controller *controller,
e09b92
 	if (!controller)
e09b92
 		return ECGINVAL;
e09b92
 
e09b92
-	if (controller->index >= CG_VALUE_MAX)
e09b92
+	if (controller->index >= CG_NV_MAX)
e09b92
 		return ECGMAXVALUESEXCEEDED;
e09b92
 
e09b92
-	for (i = 0; i < controller->index && i < CG_VALUE_MAX; i++) {
e09b92
+	for (i = 0; i < controller->index && i < CG_NV_MAX; i++) {
e09b92
 		if (!strcmp(controller->values[i]->name, name))
e09b92
 			return ECGVALUEEXISTS;
e09b92
 	}
e09b92
@@ -195,8 +195,15 @@ int cgroup_add_value_string(struct cgroup_controller *controller,
e09b92
 	if (!cntl_value)
e09b92
 		return ECGCONTROLLERCREATEFAILED;
e09b92
 
e09b92
-	strncpy(cntl_value->name, name, sizeof(cntl_value->name));
e09b92
-	strncpy(cntl_value->value, value, sizeof(cntl_value->value));
e09b92
+	if (strlen(value) >= sizeof(cntl_value->value)) {
e09b92
+		fprintf(stderr, "value exceeds the maximum of %lu characters\n",
e09b92
+			sizeof(cntl_value->value));
e09b92
+		free(cntl_value);
e09b92
+		return ECGCONFIGPARSEFAIL;
e09b92
+	}
e09b92
+
e09b92
+	strncpy(cntl_value->name, name, sizeof(cntl_value->name) - 1);
e09b92
+	strncpy(cntl_value->value, value, sizeof(cntl_value->value) - 1);
e09b92
 	cntl_value->dirty = true;
e09b92
 	controller->values[controller->index] = cntl_value;
e09b92
 	controller->index++;
e09b92
@@ -406,7 +413,7 @@ int cgroup_set_value_string(struct cgroup_controller *controller,
e09b92
 	for (i = 0; i < controller->index; i++) {
e09b92
 		struct control_value *val = controller->values[i];
e09b92
 		if (!strcmp(val->name, name)) {
e09b92
-			strncpy(val->value, value, CG_VALUE_MAX);
e09b92
+			strncpy(val->value, value, CG_CONTROL_VALUE_MAX - 1);
e09b92
 			val->dirty = true;
e09b92
 			return 0;
e09b92
 		}