[lxc-devel] [PATCH] coverity: rundir: Fix memory leaks
Stéphane Graber
stgraber at ubuntu.com
Wed Feb 19 05:50:03 UTC 2014
Since we're no longer always returning a getenv result or some defined
string, the callers should cleanup the variable after use.
As a result, change from const char* to char*, add the needed free()
everywhere and use strdup() on strings coming from getenv.
Signed-off-by: Stéphane Graber <stgraber at ubuntu.com>
---
src/lxc/lxclock.c | 11 +++++++++--
src/lxc/monitor.c | 6 +++++-
src/lxc/utils.c | 23 +++++++++++++----------
src/lxc/utils.h | 2 +-
4 files changed, 28 insertions(+), 14 deletions(-)
diff --git a/src/lxc/lxclock.c b/src/lxc/lxclock.c
index 598d6c0..b7a0078 100644
--- a/src/lxc/lxclock.c
+++ b/src/lxc/lxclock.c
@@ -98,7 +98,7 @@ static char *lxclock_name(const char *p, const char *n)
int ret;
int len;
char *dest;
- const char *rundir;
+ char *rundir;
/* lockfile will be:
* "/run" + "/lock/lxc/$lxcpath/$lxcname + '\0' if root
@@ -113,12 +113,15 @@ static char *lxclock_name(const char *p, const char *n)
return NULL;
len += strlen(rundir);
- if ((dest = malloc(len)) == NULL)
+ if ((dest = malloc(len)) == NULL) {
+ free(rundir);
return NULL;
+ }
ret = snprintf(dest, len, "%s/lock/lxc/%s", rundir, p);
if (ret < 0 || ret >= len) {
free(dest);
+ free(rundir);
return NULL;
}
ret = mkdir_p(dest, 0755);
@@ -130,6 +133,7 @@ static char *lxclock_name(const char *p, const char *n)
d = realloc(dest, l2);
if (!d) {
free(dest);
+ free(rundir);
return NULL;
}
len = l2;
@@ -138,12 +142,15 @@ static char *lxclock_name(const char *p, const char *n)
ret = snprintf(dest, len, "/tmp/%d/lxc/%s", geteuid(), p);
if (ret < 0 || ret >= len) {
free(dest);
+ free(rundir);
return NULL;
}
ret = snprintf(dest, len, "/tmp/%d/lxc/%s/%s", geteuid(), p, n);
} else
ret = snprintf(dest, len, "%s/lock/lxc/%s/%s", rundir, p, n);
+ free(rundir);
+
if (ret < 0 || ret >= len) {
free(dest);
return NULL;
diff --git a/src/lxc/monitor.c b/src/lxc/monitor.c
index 704cc22..e45b5cf 100644
--- a/src/lxc/monitor.c
+++ b/src/lxc/monitor.c
@@ -54,7 +54,7 @@ int lxc_monitor_fifo_name(const char *lxcpath, char *fifo_path, size_t fifo_path
int do_mkdirp)
{
int ret;
- const char *rundir;
+ char *rundir;
rundir = get_rundir();
if (!rundir)
@@ -64,19 +64,23 @@ int lxc_monitor_fifo_name(const char *lxcpath, char *fifo_path, size_t fifo_path
ret = snprintf(fifo_path, fifo_path_sz, "%s/lxc/%s", rundir, lxcpath);
if (ret < 0 || ret >= fifo_path_sz) {
ERROR("rundir/lxcpath (%s/%s) too long for monitor fifo", rundir, lxcpath);
+ free(rundir);
return -1;
}
ret = mkdir_p(fifo_path, 0755);
if (ret < 0) {
ERROR("unable to create monitor fifo dir %s", fifo_path);
+ free(rundir);
return ret;
}
}
ret = snprintf(fifo_path, fifo_path_sz, "%s/lxc/%s/monitor-fifo", rundir, lxcpath);
if (ret < 0 || ret >= fifo_path_sz) {
ERROR("rundir/lxcpath (%s/%s) too long for monitor fifo", rundir, lxcpath);
+ free(rundir);
return -1;
}
+ free(rundir);
return 0;
}
diff --git a/src/lxc/utils.c b/src/lxc/utils.c
index db5cc19..c5c450d 100644
--- a/src/lxc/utils.c
+++ b/src/lxc/utils.c
@@ -376,7 +376,7 @@ out:
return values[i];
}
-const char *get_rundir()
+char *get_rundir()
{
char *rundir;
const char *homedir;
@@ -387,18 +387,21 @@ const char *get_rundir()
}
rundir = getenv("XDG_RUNTIME_DIR");
- if (!rundir) {
- INFO("XDG_RUNTIME_DIR isn't set in the environment.");
- homedir = getenv("HOME");
- if (!homedir) {
- ERROR("HOME isn't set in the environment.");
- return NULL;
- }
+ if (rundir) {
+ rundir = strdup(rundir);
+ return rundir;
+ }
- rundir = malloc(sizeof(char) * (17 + strlen(homedir)));
- sprintf(rundir, "%s/.cache/lxc/run/", homedir);
+ INFO("XDG_RUNTIME_DIR isn't set in the environment.");
+ homedir = getenv("HOME");
+ if (!homedir) {
+ ERROR("HOME isn't set in the environment.");
+ return NULL;
}
+ rundir = malloc(sizeof(char) * (17 + strlen(homedir)));
+ sprintf(rundir, "%s/.cache/lxc/run/", homedir);
+
return rundir;
}
diff --git a/src/lxc/utils.h b/src/lxc/utils.h
index f541253..f6f3373 100644
--- a/src/lxc/utils.h
+++ b/src/lxc/utils.h
@@ -39,7 +39,7 @@ extern void lxc_setup_fs(void);
extern int get_u16(unsigned short *val, const char *arg, int base);
extern int mkdir_p(const char *dir, mode_t mode);
extern void remove_trailing_slashes(char *p);
-extern const char *get_rundir(void);
+extern char *get_rundir(void);
extern const char *lxc_global_config_value(const char *option_name);
--
1.9.rc1
More information about the lxc-devel
mailing list