[lxc-devel] [lxc/master] cgroups: prevent segfault in cgfsng

brauner on Github lxc-bot at linuxcontainers.org
Wed Nov 16 15:45:45 UTC 2016


A non-text attachment was scrubbed...
Name: not available
Type: text/x-mailbox
Size: 565 bytes
Desc: not available
URL: <http://lists.linuxcontainers.org/pipermail/lxc-devel/attachments/20161116/fe9d4d19/attachment.bin>
-------------- next part --------------
From 57d5a78b867646a9ac9b0d8ca37e925382b7b87b Mon Sep 17 00:00:00 2001
From: Christian Brauner <christian.brauner at canonical.com>
Date: Wed, 16 Nov 2016 16:43:20 +0100
Subject: [PATCH] cgroups: prevent segfault in cgfsng

When we set LXC_DEBUG_CGFSNG=1 we print out info about detected cgroup
hierarchies. When there's no named cgroup mounted we need to make sure that we
don't try to index an unallocated pointer.

Signed-off-by: Christian Brauner <christian.brauner at canonical.com>
---
 src/lxc/cgroups/cgfsng.c | 30 ++++++++++++++++--------------
 1 file changed, 16 insertions(+), 14 deletions(-)

diff --git a/src/lxc/cgroups/cgfsng.c b/src/lxc/cgroups/cgfsng.c
index 57a13dc..cf7757f 100644
--- a/src/lxc/cgroups/cgfsng.c
+++ b/src/lxc/cgroups/cgfsng.c
@@ -946,44 +946,46 @@ static void trim(char *s)
 
 static void print_init_debuginfo(struct cgfsng_handler_data *d)
 {
+	struct hierarchy **it;
 	int i;
 
 	if (!getenv("LXC_DEBUG_CGFSNG"))
 		return;
 
 	printf("Cgroup information:\n");
-	printf("  container name: %s\n", d->name);
-	printf("  lxc.cgroup.use: %s\n", cgroup_use ? cgroup_use : "(none)");
-	printf("  lxc.cgroup.pattern: %s\n", d->cgroup_pattern);
-	printf("  cgroup: %s\n", d->container_cgroup ? d->container_cgroup : "(none)");
+	printf("  container name: %s\n", d->name ? d->name : "(null)");
+	printf("  lxc.cgroup.use: %s\n", cgroup_use ? cgroup_use : "(null)");
+	printf("  lxc.cgroup.pattern: %s\n", d->cgroup_pattern ? d->cgroup_pattern : "(null)");
+	printf("  cgroup: %s\n", d->container_cgroup ? d->container_cgroup : "(null)");
 	if (!hierarchies) {
 		printf("  No hierarchies found.\n");
 		return;
 	}
 	printf("  Hierarchies:\n");
-	for (i = 0; hierarchies[i]; i++) {
-		struct hierarchy *h = hierarchies[i];
+	for (i = 0, it = hierarchies; it && *it; it++, i++) {
+		char **cit;
 		int j;
-		printf("  %d: base_cgroup %s\n", i, h->base_cgroup);
-		printf("      mountpoint %s\n", h->mountpoint);
+		printf("  %d: base_cgroup %s\n", i, (*it)->base_cgroup ? (*it)->base_cgroup : "(null)");
+		printf("      mountpoint %s\n", (*it)->mountpoint ? (*it)->mountpoint : "(null)");
 		printf("      controllers:\n");
-		for (j = 0; h->controllers[j]; j++)
-			printf("     %d: %s\n", j, h->controllers[j]);
+		for (j = 0, cit = (*it)->controllers; cit && *cit; cit++, j++)
+			printf("     %d: %s\n", j, *cit);
 	}
 }
 
 static void print_basecg_debuginfo(char *basecginfo, char **klist, char **nlist)
 {
 	int k;
+	char **it;
 	if (!getenv("LXC_DEBUG_CGFSNG"))
 		return;
 
 	printf("basecginfo is %s\n", basecginfo);
 
-	for (k = 0; klist[k]; k++)
-		printf("kernel subsystem %d: %s\n", k, klist[k]);
-	for (k = 0; nlist[k]; k++)
-		printf("named subsystem %d: %s\n", k, nlist[k]);
+	for (k = 0, it = klist; it && *it; it++, k++)
+		printf("kernel subsystem %d: %s\n", k, *it);
+	for (k = 0, it = nlist; it && *it; it++, k++)
+		printf("named subsystem %d: %s\n", k, *it);
 }
 
 /*


More information about the lxc-devel mailing list