[lxc-devel] [PATCH] valgrind drd tool shows conflicting stores happening at lxc_global_config_value at src/lxc/utils.c

S.Çağlar Onur caglar at 10ur.org
Wed Oct 30 21:42:11 UTC 2013


Conflict occurs between following lines

[...]
269         if (values[i])
270                 return values[i];
[...]

and

[...]
309         /* could not find value, use default */
310         values[i] = (*ptr)[1];
[...]

so call it while holding the process_lock

Signed-off-by: S.Çağlar Onur <caglar at 10ur.org>
---
 src/lxc/cgroup.c |  2 +-
 src/lxc/start.c  |  2 +-
 src/lxc/utils.c  | 41 +++++++++++++++++++++++++++++++++--------
 src/lxc/utils.h  |  3 ++-
 4 files changed, 37 insertions(+), 11 deletions(-)

diff --git a/src/lxc/cgroup.c b/src/lxc/cgroup.c
index 01ed040..1e1e72a 100644
--- a/src/lxc/cgroup.c
+++ b/src/lxc/cgroup.c
@@ -91,7 +91,7 @@ struct cgroup_meta_data *lxc_cgroup_load_meta()
 	int saved_errno;
 
 	errno = 0;
-	cgroup_use = lxc_global_config_value("cgroup.use");
+       cgroup_use = default_cgroup_use();
 	if (!cgroup_use && errno != 0)
 		return NULL;
 	if (cgroup_use) {
diff --git a/src/lxc/start.c b/src/lxc/start.c
index 1cadc09..58e1194 100644
--- a/src/lxc/start.c
+++ b/src/lxc/start.c
@@ -695,7 +695,7 @@ int lxc_spawn(struct lxc_handler *handler)
 	 * default value is available
 	 */
 	if (getuid() == 0)
-		cgroup_pattern = lxc_global_config_value("cgroup.pattern");
+               cgroup_pattern = default_cgroup_pattern();
 	if (!cgroup_pattern)
 		cgroup_pattern = "%n";
 
diff --git a/src/lxc/utils.c b/src/lxc/utils.c
index 9e2e326..6129cf8 100644
--- a/src/lxc/utils.c
+++ b/src/lxc/utils.c
@@ -269,9 +269,7 @@ const char *lxc_global_config_value(const char *option_name)
 	if (values[i])
 		return values[i];
 
-	process_lock();
 	fin = fopen_cloexec(LXC_GLOBAL_CONF, "r");
-	process_unlock();
 	if (fin) {
 		while (fgets(buf, 1024, fin)) {
 			if (buf[0] == '#')
@@ -317,30 +315,57 @@ const char *lxc_global_config_value(const char *option_name)
 		errno = 0;
 
 out:
-	process_lock();
 	if (fin)
 		fclose(fin);
-	process_unlock();
 	return values[i];
 }
 
 const char *default_lvm_vg(void)
 {
-	return lxc_global_config_value("lvm_vg");
+	process_lock();
+	const char *ret = lxc_global_config_value("lvm_vg");
+	process_unlock();
+	return ret;
 }
 
 const char *default_lvm_thin_pool(void)
 {
-	return lxc_global_config_value("lvm_thin_pool");
+	process_lock();
+	const char *ret = lxc_global_config_value("lvm_thin_pool");
+	process_unlock();
+	return ret;
 }
 
 const char *default_zfs_root(void)
 {
-	return lxc_global_config_value("zfsroot");
+	process_lock();
+	const char *ret = lxc_global_config_value("zfsroot");
+	process_unlock();
+	return ret;
 }
+
 const char *default_lxc_path(void)
 {
-	return lxc_global_config_value("lxcpath");
+	process_lock();
+	const char *ret = lxc_global_config_value("lxcpath");
+	process_unlock();
+	return ret;
+}
+
+const char *default_cgroup_use(void)
+{
+	process_lock();
+	const char *ret = lxc_global_config_value("cgroup.use");
+	process_unlock();
+	return ret;
+}
+
+const char *default_cgroup_pattern(void)
+{
+	process_lock();
+	const char *ret = lxc_global_config_value("cgroup.pattern");
+	process_unlock();
+	return ret;
 }
 
 const char *get_rundir()
diff --git a/src/lxc/utils.h b/src/lxc/utils.h
index fc46760..8aa1550 100644
--- a/src/lxc/utils.h
+++ b/src/lxc/utils.h
@@ -49,7 +49,8 @@ extern const char *default_lxc_path(void);
 extern const char *default_zfs_root(void);
 extern const char *default_lvm_vg(void);
 extern const char *default_lvm_thin_pool(void);
-
+extern const char *default_cgroup_use(void);
+extern const char *default_cgroup_pattern(void);
 /* Define getline() if missing from the C library */
 #ifndef HAVE_GETLINE
 #ifdef HAVE_FGETLN
-- 
1.8.3.2





More information about the lxc-devel mailing list