From 5b1d95046c8ea624419d94dd7d9e2785ba86f556 Mon Sep 17 00:00:00 2001 From: Andreas Schneider Date: Fri, 14 Dec 2012 17:54:13 +0100 Subject: param: Correctly create directory and create common function. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Found by Coverity. Signed-off-by: Andreas Schneider Reviewed-by: Günther Deschner --- lib/param/util.c | 96 ++++++++++++++++++++++++-------------------------------- 1 file changed, 41 insertions(+), 55 deletions(-) (limited to 'lib/param') diff --git a/lib/param/util.c b/lib/param/util.c index 98894fc747..2569e7b89b 100644 --- a/lib/param/util.c +++ b/lib/param/util.c @@ -71,14 +71,13 @@ bool lpcfg_is_myname(struct loadparm_context *lp_ctx, const char *name) return false; } - -/** - A useful function for returning a path in the Samba lock directory. -**/ -char *lpcfg_lock_path(TALLOC_CTX* mem_ctx, struct loadparm_context *lp_ctx, - const char *name) +static char *lpcfg_common_path(TALLOC_CTX* mem_ctx, + struct loadparm_context *lp_ctx, + const char *name) { char *fname, *dname; + bool ok; + if (name == NULL) { return NULL; } @@ -87,47 +86,44 @@ char *lpcfg_lock_path(TALLOC_CTX* mem_ctx, struct loadparm_context *lp_ctx, } dname = talloc_strdup(mem_ctx, lpcfg_lockdir(lp_ctx)); + if (dname == NULL) { + return NULL; + } trim_string(dname,"","/"); - - if (!directory_exist(dname)) { - if (!mkdir(dname,0755)) - DEBUG(1, ("Unable to create directory %s for file %s. " - "Error was %s\n", dname, name, strerror(errno))); + + ok = directory_create_or_exist(dname, geteuid(), 0755); + if (!ok) { + DEBUG(1, ("Unable to create directory %s for file %s. " + "Error was %s\n", dname, name, strerror(errno))); + return NULL; } - - fname = talloc_asprintf(mem_ctx, "%s/%s", dname, name); + fname = talloc_asprintf(mem_ctx, "%s/%s", dname, name); + if (fname == NULL) { + return dname; + } talloc_free(dname); return fname; } + +/** + A useful function for returning a path in the Samba lock directory. +**/ +char *lpcfg_lock_path(TALLOC_CTX* mem_ctx, struct loadparm_context *lp_ctx, + const char *name) +{ + return lpcfg_common_path(mem_ctx, lp_ctx, name); +} + /** A useful function for returning a path in the Samba state directory. **/ char *lpcfg_state_path(TALLOC_CTX* mem_ctx, struct loadparm_context *lp_ctx, const char *name) { - char *fname, *dname; - if (name == NULL) { - return NULL; - } - if (name[0] == 0 || name[0] == '/' || strstr(name, ":/")) { - return talloc_strdup(mem_ctx, name); - } - - dname = talloc_strdup(mem_ctx, lpcfg_statedir(lp_ctx)); - trim_string(dname,"","/"); - - if (!directory_exist(dname)) { - mkdir(dname,0755); - } - - fname = talloc_asprintf(mem_ctx, "%s/%s", dname, name); - - talloc_free(dname); - - return fname; + return lpcfg_common_path(mem_ctx, lp_ctx, name); } /** @@ -136,26 +132,7 @@ char *lpcfg_state_path(TALLOC_CTX* mem_ctx, struct loadparm_context *lp_ctx, char *lpcfg_cache_path(TALLOC_CTX* mem_ctx, struct loadparm_context *lp_ctx, const char *name) { - char *fname, *dname; - if (name == NULL) { - return NULL; - } - if (name[0] == 0 || name[0] == '/' || strstr(name, ":/")) { - return talloc_strdup(mem_ctx, name); - } - - dname = talloc_strdup(mem_ctx, lpcfg_cachedir(lp_ctx)); - trim_string(dname,"","/"); - - if (!directory_exist(dname)) { - mkdir(dname,0755); - } - - fname = talloc_asprintf(mem_ctx, "%s/%s", dname, name); - - talloc_free(dname); - - return fname; + return lpcfg_common_path(mem_ctx, lp_ctx, name); } /** @@ -222,10 +199,16 @@ char *smbd_tmp_path(TALLOC_CTX *mem_ctx, const char *name) { char *fname, *dname; + bool ok; dname = lpcfg_private_path(mem_ctx, lp_ctx, "smbd.tmp"); - if (!directory_exist(dname)) { - mkdir(dname,0755); + if (dname == NULL) { + return NULL; + } + + ok = directory_create_or_exist(dname, geteuid(), 0755); + if (!ok) { + return NULL; } if (name == NULL) { @@ -233,6 +216,9 @@ char *smbd_tmp_path(TALLOC_CTX *mem_ctx, } fname = talloc_asprintf(mem_ctx, "%s/%s", dname, name); + if (fname == NULL) { + return dname; + } talloc_free(dname); return fname; -- cgit