[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