]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib: safe-mkstemp - Add safe_mkstemp_dir*()
authorStephan Bosch <stephan.bosch@open-xchange.com>
Fri, 31 Oct 2025 13:44:10 +0000 (14:44 +0100)
committertimo.sirainen <timo.sirainen@open-xchange.com>
Wed, 5 Nov 2025 10:17:48 +0000 (10:17 +0000)
src/lib/safe-mkstemp.c
src/lib/safe-mkstemp.h

index a2f0c345f095c806334ecea0c2e3522278f4a6ff..cb834ff165e9860f0c4537cf462bf2861bf627ac 100644 (file)
@@ -130,3 +130,37 @@ int safe_mkstemp_hostpid_group(string_t *prefix, mode_t mode,
                str_truncate(prefix, orig_prefix_len);
        return fd;
 }
+
+static int
+safe_mkstemp_create_dir(const char *path, mode_t mode)
+{
+       mode_t old_umask;
+       int ret;
+
+       old_umask = umask(0777 ^ mode);
+       ret = mkdir(path, 0777);
+       umask(old_umask);
+
+       if (ret != -1)
+               return ret;
+       if (errno != EEXIST && errno != ENOENT && errno != EACCES)
+               i_error("mkdir(%s) failed: %m", path);
+       return -1;
+}
+
+int safe_mkstemp_dir(string_t *prefix, mode_t mode)
+{
+       return safe_mkstemp_create(prefix, mode, safe_mkstemp_create_dir);
+}
+
+int safe_mkstemp_dir_pid(string_t *prefix, mode_t mode)
+{
+       size_t orig_prefix_len = str_len(prefix);
+
+       str_printfa(prefix, "%s.", my_pid);
+       if (safe_mkstemp_dir(prefix, mode) == -1) {
+               str_truncate(prefix, orig_prefix_len);
+               return -1;
+       }
+       return 0;
+}
index f04d5cfcbef803f43b8692453ebe21a443348ef9..fec3354baea9d6fdd31fa84d038f972996b40d35 100644 (file)
@@ -12,4 +12,10 @@ int safe_mkstemp_hostpid(string_t *prefix, mode_t mode, uid_t uid, gid_t gid);
 int safe_mkstemp_hostpid_group(string_t *prefix, mode_t mode,
                               gid_t gid, const char *gid_origin);
 
+/* Create a new directory with a given prefix. The string is updated to contain
+   the created path. */
+int safe_mkstemp_dir(string_t *prefix, mode_t mode);
+/* Append PID to the prefix. */
+int safe_mkstemp_dir_pid(string_t *prefix, mode_t mode);
+
 #endif