]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib: safe_mkstemp*() didn't always truncate prefix back to original on failure.
authorTimo Sirainen <timo.sirainen@dovecot.fi>
Thu, 15 Sep 2016 08:30:15 +0000 (11:30 +0300)
committerTimo Sirainen <timo.sirainen@dovecot.fi>
Mon, 19 Sep 2016 12:39:52 +0000 (15:39 +0300)
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.

src/lib/safe-mkstemp.c

index 7c8adf9842e95f06e45ecafbbee1157b2af7f179..cdc4c035e8f9457b4f6d6ab43a62566229014a6e 100644 (file)
@@ -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;
 }