]> git.sesse.net Git - cubemap/blobdiff - util.cpp
Set umask explicitly before calling mkstemp().
[cubemap] / util.cpp
index 45bf5b52453309b1ff178d63ed1d64603e76b9de..5659bed0802bd1062644f79cc49b80234a9698da 100644 (file)
--- a/util.cpp
+++ b/util.cpp
@@ -2,29 +2,37 @@
 #include <stddef.h>
 #include <stdio.h>
 #include <stdlib.h>
-#include <unistd.h>
+#include <fcntl.h>
 #include <sys/stat.h>
-#include <sys/types.h>
+#include <unistd.h>
 
 #include "log.h"
 #include "util.h"
 
+#ifndef O_TMPFILE
+#define __O_TMPFILE 020000000
+#define O_TMPFILE (__O_TMPFILE | O_DIRECTORY)
+#endif
+
 using namespace std;
 
 int make_tempfile(const std::string &contents)
 {
        char filename[] = "/tmp/cubemap.XXXXXX";
-       mode_t old_umask = umask(0600);
-       int fd = mkstemp(filename);
-       umask(old_umask);
+       int fd = open(filename, O_RDWR | O_TMPFILE, 0600);
        if (fd == -1) {
-               log_perror("mkstemp");
-               return -1;
-       }
+               mode_t old_umask = umask(077);
+               fd = mkstemp(filename);
+               if (fd == -1) {
+                       log_perror("mkstemp");
+                       return -1;
+               }
+               umask(old_umask);
 
-       if (unlink(filename) == -1) {
-               log_perror("unlink");
-               // Can still continue;
+               if (unlink(filename) == -1) {
+                       log_perror("unlink");
+                       // Can still continue.
+               }
        }
 
        const char *ptr = contents.data();
@@ -33,7 +41,7 @@ int make_tempfile(const std::string &contents)
                ssize_t ret = write(fd, ptr, to_write);
                if (ret == -1) {
                        log_perror("write");
-                       close(fd);
+                       safe_close(fd);
                        return -1;
                }
 
@@ -47,17 +55,7 @@ int make_tempfile(const std::string &contents)
 bool read_tempfile_and_close(int fd, std::string *contents)
 {
        bool ok = read_tempfile(fd, contents);
-
-       int ret;
-       do {
-               ret = close(fd);  // Implicitly deletes the file.
-       } while (ret == -1 && errno == EINTR);
-       
-       if (ret == -1) {
-               log_perror("close");
-               // Can still continue.
-       }
-
+       safe_close(fd);  // Implicitly deletes the file.
        return ok;
 }
 
@@ -94,3 +92,17 @@ bool read_tempfile(int fd, std::string *contents)
 
        return true;
 }
+
+int safe_close(int fd)
+{
+       int ret;
+       do {
+               ret = close(fd);
+       } while (ret == -1 && errno == EINTR);
+
+       if (ret == -1) {
+               log_perror("close()");
+       }
+
+       return ret;
+}