param: Correctly create directory and create common function.
authorAndreas Schneider <asn@samba.org>
Fri, 14 Dec 2012 16:54:13 +0000 (17:54 +0100)
committerGünther Deschner <gd@samba.org>
Fri, 21 Dec 2012 12:56:00 +0000 (13:56 +0100)
Found by Coverity.

Signed-off-by: Andreas Schneider <asn@samba.org>
Reviewed-by: Günther Deschner <gd@samba.org>
lib/param/util.c

index 98894fc747e8d2e594e62a2f662429f0433cc143..2569e7b89bf355c62b075385e8d6f45e57e5ec7e 100644 (file)
@@ -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;