You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by mt...@apache.org on 2009/09/08 16:37:12 UTC

svn commit: r812529 - /commons/sandbox/runtime/trunk/src/main/native/os/unix/temps.c

Author: mturk
Date: Tue Sep  8 14:37:12 2009
New Revision: 812529

URL: http://svn.apache.org/viewvc?rev=812529&view=rev
Log:
Ensure we cannot be interrupted during temp file create transaction

Modified:
    commons/sandbox/runtime/trunk/src/main/native/os/unix/temps.c

Modified: commons/sandbox/runtime/trunk/src/main/native/os/unix/temps.c
URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/native/os/unix/temps.c?rev=812529&r1=812528&r2=812529&view=diff
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/native/os/unix/temps.c (original)
+++ commons/sandbox/runtime/trunk/src/main/native/os/unix/temps.c Tue Sep  8 14:37:12 2009
@@ -68,6 +68,8 @@
     int  fd;
     char name[PATH_MAX] = "";
     acr_file_t *fp;
+    sigset_t bset;
+    sigset_t oset;
 
     if (tmpath) {
         if (strlcpy(name, tmpath, TMP_PATH_MAX) >= TMP_PATH_MAX) {
@@ -85,25 +87,34 @@
         ACR_THROW_IO_IF_ERR(ACR_E2BIG);
         return -1;
     }
-
+    /* Block signals.
+     * Make sure file goes away at process exit.
+     */
+    sigfillset(&bset);
+    sigprocmask(SIG_BLOCK, &bset, &oset);
     fd = mkstemp(name);
-    if (fd < 0) {
-        ACR_THROW_IO_ERRNO();
-        return -1;
-    }
-    if (preserve) {
+    if (fd > 0) {
         /* Set close on exec flag */
         int flags;
+        if (preserve == 0)
+            unlink(name);
+        rc = 0;
         if ((flags = fcntl(fd, F_GETFD)) < 0) {
-            goto cleanup;
+            rc = errno;
         }
-        flags |= FD_CLOEXEC;
-        if (fcntl(fd, F_SETFD, flags) < 0) {
-            goto cleanup;
+        else {
+            flags |= FD_CLOEXEC;
+            if (fcntl(fd, F_SETFD, flags) < 0) {
+                rc = errno;
+            }
         }
     }
     else
-        unlink(name);
+        rc = errno;
+    sigprocmask(SIG_SETMASK, &oset, (sigset_t *)NULL);
+    if (rc) {
+        goto finally;
+    }
     fp = ACR_Calloc(_E, THROW_NMARK, sizeof(acr_file_t));
     if (!fp) {
         goto cleanup;
@@ -115,8 +126,10 @@
 
 cleanup:
     rc = ACR_GET_OS_ERROR();
+finally:
     unlink(name);
-    close(fd);
+    if (fd > 0)
+        close(fd);
     ACR_THROW_IO_IF_ERR(rc);
     return -1;
 }