[lxc-devel] [PATCH] refactor string conf items into common function

Dwight Engen dwight.engen at oracle.com
Mon Sep 30 15:17:06 UTC 2013


- When doing the selinux change, I noticed that there was a lot of
  duplication of code in handing string configuration items, so I
  refactored this into a common function.

- Added a config_string_max that can be passed a maximum acceptable
  length, used to limit ttydir to NAME_MAX.

- The behavior of config_seccomp was different than other strings: if the
  item was already defined, then the second attempt to set it would fail
  instead of just replacing the value. Changed to just replace the value.

- Remove unused key and lxc_conf arguments to config_path_item().

Signed-off-by: Dwight Engen <dwight.engen at oracle.com>
---
 src/lxc/confile.c | 178 ++++++++++++++++--------------------------------------
 1 file changed, 52 insertions(+), 126 deletions(-)

diff --git a/src/lxc/confile.c b/src/lxc/confile.c
index ee2832c..a31479e 100644
--- a/src/lxc/confile.c
+++ b/src/lxc/confile.c
@@ -212,6 +212,41 @@ int lxc_listconfigs(char *retv, int inlen)
 	return fulllen;
 }
 
+static int config_string_item(char **conf_item, const char *value)
+{
+	char *new_value;
+
+	if (!value || strlen(value) == 0)
+		return 0;
+
+	new_value = strdup(value);
+	if (!new_value) {
+		SYSERROR("failed to strdup '%s': %m", value);
+		return -1;
+	}
+
+	if (*conf_item)
+		free(*conf_item);
+	*conf_item = new_value;
+	return 0;
+}
+
+static int config_string_item_max(char **conf_item, const char *value,
+				  size_t max)
+{
+	if (strlen(value) >= max) {
+		ERROR("%s is too long (>= %lu)", value, max);
+		return -1;
+	}
+
+	return config_string_item(conf_item, value);
+}
+
+static int config_path_item(char **conf_item, const char *value)
+{
+	return config_string_item_max(conf_item, value, PATH_MAX);
+}
+
 /*
  * config entry is something like "lxc.network.0.ipv4"
  * the key 'lxc.network.' was found.  So we make sure next
@@ -535,22 +570,12 @@ static int config_network_hwaddr(const char *key, const char *value,
 				 struct lxc_conf *lxc_conf)
 {
 	struct lxc_netdev *netdev;
-	char *hwaddr;
 
 	netdev = network_netdev(key, value, &lxc_conf->network);
 	if (!netdev)
 		return -1;
 
-	hwaddr = strdup(value);
-	if (!hwaddr) {
-		SYSERROR("failed to dup string '%s'", value);
-		return -1;
-	}
-
-	if (netdev->hwaddr)
-		free(netdev->hwaddr);
-	netdev->hwaddr = hwaddr;
-	return 0;
+	return config_string_item(&netdev->hwaddr, value);
 }
 
 static int config_network_vlan_id(const char *key, const char *value,
@@ -572,22 +597,12 @@ static int config_network_mtu(const char *key, const char *value,
 			      struct lxc_conf *lxc_conf)
 {
 	struct lxc_netdev *netdev;
-	char *mtu;
 
 	netdev = network_netdev(key, value, &lxc_conf->network);
 	if (!netdev)
 		return -1;
 
-	mtu = strdup(value);
-	if (!mtu) {
-		SYSERROR("failed to dup string '%s'", value);
-		return -1;
-	}
-
-	if (netdev->mtu)
-		free(netdev->mtu);
-	netdev->mtu = mtu;
-	return 0;
+	return config_string_item(&netdev->mtu, value);
 }
 
 static int config_network_ipv4(const char *key, const char *value,
@@ -856,23 +871,7 @@ static int add_hook(struct lxc_conf *lxc_conf, int which, char *hook)
 static int config_seccomp(const char *key, const char *value,
 				 struct lxc_conf *lxc_conf)
 {
-	char *path;
-
-	if (lxc_conf->seccomp) {
-		ERROR("seccomp already defined");
-		return -1;
-	}
-	path = strdup(value);
-	if (!path) {
-		SYSERROR("failed to strdup '%s': %m", value);
-		return -1;
-	}
-
-	if (lxc_conf->seccomp)
-		free(lxc_conf->seccomp);
-	lxc_conf->seccomp = path;
-
-	return 0;
+	return config_path_item(&lxc_conf->seccomp, value);
 }
 
 static int config_hook(const char *key, const char *value,
@@ -938,21 +937,7 @@ static int config_tty(const char *key, const char *value,
 static int config_ttydir(const char *key, const char *value,
 			  struct lxc_conf *lxc_conf)
 {
-	char *path;
-
-	if (!value || strlen(value) == 0)
-		return 0;
-	path = strdup(value);
-	if (!path) {
-		SYSERROR("failed to strdup '%s': %m", value);
-		return -1;
-	}
-
-	if (lxc_conf->ttydir)
-		free(lxc_conf->ttydir);
-	lxc_conf->ttydir = path;
-
-	return 0;
+	return config_string_item_max(&lxc_conf->ttydir, value, NAME_MAX+1);
 }
 
 static int config_kmsg(const char *key, const char *value,
@@ -968,52 +953,26 @@ static int config_kmsg(const char *key, const char *value,
 static int config_lsm_aa_profile(const char *key, const char *value,
 				 struct lxc_conf *lxc_conf)
 {
-	char *path;
-
-	if (!value || strlen(value) == 0)
-		return 0;
-	path = strdup(value);
-	if (!path) {
-		SYSERROR("failed to strdup '%s': %m", value);
-		return -1;
-	}
-
-	if (lxc_conf->lsm_aa_profile)
-		free(lxc_conf->lsm_aa_profile);
-	lxc_conf->lsm_aa_profile = path;
-
-	return 0;
+	return config_string_item(&lxc_conf->lsm_aa_profile, value);
 }
 
 static int config_lsm_se_context(const char *key, const char *value,
 				 struct lxc_conf *lxc_conf)
 {
-	char *path;
-
-	if (!value || strlen(value) == 0)
-		return 0;
-	path = strdup(value);
-	if (!path) {
-		SYSERROR("failed to strdup '%s': %m", value);
-		return -1;
-	}
-
-	if (lxc_conf->lsm_se_context)
-		free(lxc_conf->lsm_se_context);
-	lxc_conf->lsm_se_context = path;
-
-	return 0;
+	return config_string_item(&lxc_conf->lsm_se_context, value);
 }
 
 static int config_logfile(const char *key, const char *value,
 			     struct lxc_conf *lxc_conf)
 {
+	int ret;
+
 	// store these values in the lxc_conf, and then try to set for
 	// actual current logging.
-	if (lxc_conf->logfile)
-		free(lxc_conf->logfile);
-	lxc_conf->logfile = strdup(value);
-	return lxc_log_set_file(value);
+	ret = config_path_item(&lxc_conf->logfile, value);
+	if (ret == 0)
+		ret = lxc_log_set_file(lxc_conf->logfile);
+	return ret;
 }
 
 static int config_loglevel(const char *key, const char *value,
@@ -1224,31 +1183,10 @@ out:
 	return -1;
 }
 
-static int config_path_item(const char *key, const char *value,
-			    struct lxc_conf *lxc_conf, char **conf_item)
-{
-	char *valdup;
-	if (strlen(value) >= MAXPATHLEN) {
-		ERROR("%s path is too long", value);
-		return -1;
-	}
-
-	valdup = strdup(value);
-	if (!valdup) {
-		SYSERROR("failed to duplicate string %s", value);
-		return -1;
-	}
-	if (*conf_item)
-		free(*conf_item);
-	*conf_item = valdup;
-
-	return 0;
-}
-
 static int config_fstab(const char *key, const char *value,
 			struct lxc_conf *lxc_conf)
 {
-	return config_path_item(key, value, lxc_conf, &lxc_conf->fstab);
+	return config_path_item(&lxc_conf->fstab, value);
 }
 
 static int config_mount_auto(const char *key, const char *value,
@@ -1455,19 +1393,7 @@ static int config_cap_drop(const char *key, const char *value,
 static int config_console(const char *key, const char *value,
 			  struct lxc_conf *lxc_conf)
 {
-	char *path;
-
-	path = strdup(value);
-	if (!path) {
-		SYSERROR("failed to strdup '%s': %m", value);
-		return -1;
-	}
-
-	if (lxc_conf->console.path)
-		free(lxc_conf->console.path);
-	lxc_conf->console.path = path;
-
-	return 0;
+	return config_path_item(&lxc_conf->console.path, value);
 }
 
 static int config_includefile(const char *key, const char *value,
@@ -1479,19 +1405,19 @@ static int config_includefile(const char *key, const char *value,
 static int config_rootfs(const char *key, const char *value,
 			 struct lxc_conf *lxc_conf)
 {
-	return config_path_item(key, value, lxc_conf, &lxc_conf->rootfs.path);
+	return config_path_item(&lxc_conf->rootfs.path, value);
 }
 
 static int config_rootfs_mount(const char *key, const char *value,
 			       struct lxc_conf *lxc_conf)
 {
-	return config_path_item(key, value, lxc_conf, &lxc_conf->rootfs.mount);
+	return config_path_item(&lxc_conf->rootfs.mount, value);
 }
 
 static int config_pivotdir(const char *key, const char *value,
 			   struct lxc_conf *lxc_conf)
 {
-	return config_path_item(key, value, lxc_conf, &lxc_conf->rootfs.pivot);
+	return config_path_item(&lxc_conf->rootfs.pivot, value);
 }
 
 static int config_utsname(const char *key, const char *value,
-- 
1.8.1.4





More information about the lxc-devel mailing list