From: Stephan Bosch Date: Fri, 31 Oct 2025 13:44:10 +0000 (+0100) Subject: lib: safe-mkstemp - Add safe_mkstemp_dir*() X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=f2b55ac1179b56bb8508df18c90c6928a1f9dde5;p=thirdparty%2Fdovecot%2Fcore.git lib: safe-mkstemp - Add safe_mkstemp_dir*() --- diff --git a/src/lib/safe-mkstemp.c b/src/lib/safe-mkstemp.c index a2f0c345f0..cb834ff165 100644 --- a/src/lib/safe-mkstemp.c +++ b/src/lib/safe-mkstemp.c @@ -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; +} diff --git a/src/lib/safe-mkstemp.h b/src/lib/safe-mkstemp.h index f04d5cfcbe..fec3354bae 100644 --- a/src/lib/safe-mkstemp.h +++ b/src/lib/safe-mkstemp.h @@ -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