From: Timo Sirainen Date: Thu, 15 Sep 2016 08:30:15 +0000 (+0300) Subject: lib: safe_mkstemp*() didn't always truncate prefix back to original on failure. X-Git-Tag: 2.3.0.rc1~3015 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=033e315cc9396332a09b98bee7824b8e6641c2fc;p=thirdparty%2Fdovecot%2Fcore.git lib: safe_mkstemp*() didn't always truncate prefix back to original on failure. This caused repeated safe_mkstemp*() calls with the same prefix to keep increasing its size. It probably didn't really break anything (unless it was called enough many times to reach 255 filename length), but the filenames were still confusingly ugly. --- diff --git a/src/lib/safe-mkstemp.c b/src/lib/safe-mkstemp.c index 7c8adf9842..cdc4c035e8 100644 --- a/src/lib/safe-mkstemp.c +++ b/src/lib/safe-mkstemp.c @@ -65,6 +65,7 @@ safe_mkstemp_full(string_t *prefix, mode_t mode, uid_t uid, gid_t gid, } i_close_fd(&fd); i_unlink(str_c(prefix)); + str_truncate(prefix, prefix_len); return -1; } return fd; @@ -83,13 +84,23 @@ int safe_mkstemp_group(string_t *prefix, mode_t mode, int safe_mkstemp_hostpid(string_t *prefix, mode_t mode, uid_t uid, gid_t gid) { + size_t orig_prefix_len = str_len(prefix); + int fd; + str_printfa(prefix, "%s.%s.", my_hostname, my_pid); - return safe_mkstemp(prefix, mode, uid, gid); + if ((fd = safe_mkstemp(prefix, mode, uid, gid)) == -1) + str_truncate(prefix, orig_prefix_len); + return fd; } int safe_mkstemp_hostpid_group(string_t *prefix, mode_t mode, gid_t gid, const char *gid_origin) { + size_t orig_prefix_len = str_len(prefix); + int fd; + str_printfa(prefix, "%s.%s.", my_hostname, my_pid); - return safe_mkstemp_group(prefix, mode, gid, gid_origin); + if ((fd = safe_mkstemp_group(prefix, mode, gid, gid_origin)) == -1) + str_truncate(prefix, orig_prefix_len); + return fd; }