[lxc-devel] [lxc/master] confile: fix parsing

brauner on Github lxc-bot at linuxcontainers.org
Mon May 29 09:54:06 UTC 2017


A non-text attachment was scrubbed...
Name: not available
Type: text/x-mailbox
Size: 869 bytes
Desc: not available
URL: <http://lists.linuxcontainers.org/pipermail/lxc-devel/attachments/20170529/ec0f1fd1/attachment.bin>
-------------- next part --------------
From 8738738dc883175d070e1ef99ebd02dca8a4de66 Mon Sep 17 00:00:00 2001
From: Christian Brauner <christian.brauner at ubuntu.com>
Date: Mon, 29 May 2017 11:50:27 +0200
Subject: [PATCH] confile: fix parsing

We recently fixed a bug whereby lots of config items could be set but couldn't
be unset via clear_config_item(). This was especially problematic when copying
containers because the config items where stacked onto each other if they were
changed. The same problem for api calls to clear_config_item() +
set_config_item(). The fix however did not take into account that this means
that whitespace character for all of these config items need to be accounted
for. This commit does.

Closes #1595.

Signed-off-by: Christian Brauner <christian.brauner at ubuntu.com>
---
 src/lxc/confile.c | 64 ++++++++++++++++++++++++++++++++++++++++++++++++++++++-
 src/lxc/utils.h   |  1 +
 2 files changed, 64 insertions(+), 1 deletion(-)

diff --git a/src/lxc/confile.c b/src/lxc/confile.c
index 4114e9fff..a82790260 100644
--- a/src/lxc/confile.c
+++ b/src/lxc/confile.c
@@ -1151,6 +1151,11 @@ static int config_init_uid(const char *key, const char *value,
 				 struct lxc_conf *lxc_conf)
 {
 	unsigned int init_uid;
+	size_t empty;
+
+	empty = strspn(value, LXC_WHITESPACE);
+	if (*(value + empty) == '\0')
+		return 0;
 
 	if (lxc_safe_uint(value, &init_uid) < 0)
 		return -1;
@@ -1163,6 +1168,11 @@ static int config_init_gid(const char *key, const char *value,
 				 struct lxc_conf *lxc_conf)
 {
 	unsigned int init_gid;
+	size_t empty;
+
+	empty = strspn(value, LXC_WHITESPACE);
+	if (*(value + empty) == '\0')
+		return 0;
 
 	if (lxc_safe_uint(value, &init_gid) < 0)
 		return -1;
@@ -1227,6 +1237,12 @@ static int config_personality(const char *key, const char *value,
 static int config_pts(const char *key, const char *value,
 		      struct lxc_conf *lxc_conf)
 {
+	size_t empty;
+
+	empty = strspn(value, LXC_WHITESPACE);
+	if (*(value + empty) == '\0')
+		return 0;
+
 	if (lxc_safe_uint(value, &lxc_conf->pts) < 0)
 		return -1;
 
@@ -1236,6 +1252,11 @@ static int config_pts(const char *key, const char *value,
 static int config_start(const char *key, const char *value,
 		      struct lxc_conf *lxc_conf)
 {
+	size_t empty;
+	empty = strspn(value, LXC_WHITESPACE);
+	if (*(value + empty) == '\0')
+		return 0;
+
 	if(strcmp(key, "lxc.start.auto") == 0) {
 		if (lxc_safe_uint(value, &lxc_conf->start_auto) < 0)
 			return -1;
@@ -1260,6 +1281,12 @@ static int config_start(const char *key, const char *value,
 static int config_monitor(const char *key, const char *value,
 			  struct lxc_conf *lxc_conf)
 {
+	size_t empty;
+
+	empty = strspn(value, LXC_WHITESPACE);
+	if (*(value + empty) == '\0')
+		return 0;
+
 	if(strcmp(key, "lxc.monitor.unshare") == 0) {
 		if (lxc_safe_uint(value, &lxc_conf->monitor_unshare) < 0)
 			return -1;
@@ -1345,6 +1372,11 @@ static int config_environment(const char *key, const char *value,
 static int config_tty(const char *key, const char *value,
 		      struct lxc_conf *lxc_conf)
 {
+	size_t empty;
+	empty = strspn(value, LXC_WHITESPACE);
+	if (*(value + empty) == '\0')
+		return 0;
+
 	if (lxc_safe_uint(value, &lxc_conf->tty) < 0)
 		return -1;
 
@@ -1360,6 +1392,12 @@ static int config_ttydir(const char *key, const char *value,
 static int config_kmsg(const char *key, const char *value,
 			  struct lxc_conf *lxc_conf)
 {
+	size_t empty;
+
+	empty = strspn(value, LXC_WHITESPACE);
+	if (*(value + empty) == '\0')
+		return 0;
+
 	if (lxc_safe_uint(value, &lxc_conf->kmsg) < 0)
 		return -1;
 
@@ -1378,6 +1416,12 @@ static int config_lsm_aa_profile(const char *key, const char *value,
 static int config_lsm_aa_incomplete(const char *key, const char *value,
 				 struct lxc_conf *lxc_conf)
 {
+	size_t empty;
+
+	empty = strspn(value, LXC_WHITESPACE);
+	if (*(value + empty) == '\0')
+		return 0;
+
 	if (lxc_safe_uint(value, &lxc_conf->lsm_aa_allow_incomplete) < 0)
 		return -1;
 
@@ -1412,8 +1456,10 @@ static int config_loglevel(const char *key, const char *value,
 			     struct lxc_conf *lxc_conf)
 {
 	int newlevel;
+	size_t empty;
 
-	if (!value || strlen(value) == 0)
+	empty = strspn(value, LXC_WHITESPACE);
+	if (*(value + empty) == '\0')
 		return 0;
 
 	if (value[0] >= '0' && value[0] <= '9') {
@@ -1431,6 +1477,11 @@ static int config_loglevel(const char *key, const char *value,
 static int config_autodev(const char *key, const char *value,
 			  struct lxc_conf *lxc_conf)
 {
+	size_t empty;
+	empty = strspn(value, LXC_WHITESPACE);
+	if (*(value + empty) == '\0')
+		return 0;
+
 	if (lxc_safe_uint(value, &lxc_conf->autodev) < 0)
 		return -1;
 
@@ -3220,6 +3271,12 @@ bool network_new_hwaddrs(struct lxc_conf *conf)
 static int config_ephemeral(const char *key, const char *value,
 			    struct lxc_conf *lxc_conf)
 {
+	size_t empty;
+
+	empty = strspn(value, LXC_WHITESPACE);
+	if (*(value + empty) == '\0')
+		return 0;
+
 	if (lxc_safe_uint(value, &lxc_conf->ephemeral) < 0)
 		return -1;
 
@@ -3249,6 +3306,11 @@ static int config_no_new_privs(const char *key, const char *value,
 				    struct lxc_conf *lxc_conf)
 {
 	unsigned int v;
+	size_t empty;
+
+	empty = strspn(value, LXC_WHITESPACE);
+	if (*(value + empty) == '\0')
+		return 0;
 
 	if (lxc_safe_uint(value, &v) < 0)
 		return -1;
diff --git a/src/lxc/utils.h b/src/lxc/utils.h
index 320aa6bf7..b204ca383 100644
--- a/src/lxc/utils.h
+++ b/src/lxc/utils.h
@@ -44,6 +44,7 @@
 #define LXC_NUMSTRLEN64 21
 #define LXC_LINELEN 4096
 #define LXC_IDMAPLEN 4096
+#define LXC_WHITESPACE " \t\n\r"
 
 /* returns 1 on success, 0 if there were any failures */
 extern int lxc_rmdir_onedev(char *path, const char *exclude);


More information about the lxc-devel mailing list