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 <[email protected]> --- 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 _______________________________________________ lxc-devel mailing list [email protected] http://lists.linuxcontainers.org/listinfo/lxc-devel
