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/02 11:56:45 UTC

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

Author: mturk
Date: Wed Sep  2 09:56:45 2009
New Revision: 810440

URL: http://svn.apache.org/viewvc?rev=810440&view=rev
Log:
Check rv from lock init

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

Modified: commons/sandbox/runtime/trunk/src/main/native/os/win32/temps.c
URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/native/os/win32/temps.c?rev=810440&r1=810439&r2=810440&view=diff
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/native/os/win32/temps.c (original)
+++ commons/sandbox/runtime/trunk/src/main/native/os/win32/temps.c Wed Sep  2 09:56:45 2009
@@ -70,6 +70,7 @@
     HANDLE   fh;
     DWORD    rc;
     int      randnum;
+    SECURITY_ATTRIBUTES sa;
 
     if (randseed == 0) {
         randseed = GetTickCount();
@@ -113,11 +114,14 @@
         }
     }
 
+    sa.nLength = sizeof(SECURITY_ATTRIBUTES);
+    sa.lpSecurityDescriptor = NULL;
+    sa.bInheritHandle       = FALSE;
     for (;;) {
         fh = CreateFileW(path,
                          GENERIC_READ | GENERIC_WRITE,
                          0,
-                         NULL,
+                         &sa,
                          CREATE_NEW,
                          flags,
                          NULL);
@@ -244,13 +248,77 @@
 ACR_DECLARE(int) ACR_TempFileMake(JNIEnv *_E, const wchar_t *tmpath,
                                   const wchar_t *prefix, int preserve)
 {
+    int     rc;
+    DWORD   ff = preserve ? FILE_ATTRIBUTE_NORMAL : FILE_FLAG_DELETE_ON_CLOSE;
+    HANDLE  fd;
+    wchar_t name[ACR_MBUFF_SIZ] = L"";
+    acr_file_t *fp;
+
+    if (tmpath) {
+        if (wcslcpy(name, tmpath, TMP_PATH_MAX) >= TMP_PATH_MAX) {
+            ACR_THROW_IO_IF_ERR(ACR_E2BIG);
+            return -1;
+        }
+        wcslcat(name, L"\\", ACR_MBUFF_SIZ);
+    }
+    wcslcat(name, prefix, ACR_MBUFF_SIZ);
+    if (wcslcat(name, L"XXXXXX", ACR_MBUFF_SIZ) >= ACR_MBUFF_SIZ) {
+        /* Truncation occurred. We dont have enough space
+         * to create temp file template
+         */
+        ACR_THROW_IO_IF_ERR(ACR_E2BIG);
+        return -1;
+    }
+
+    fd = getftemp(name, ff);
+    if (IS_INVALID_HANDLE(fd)) {
+        ACR_THROW_IO_ERRNO();
+        return -1;
+    }
+    fp = ACR_Calloc(_E, THROW_NMARK, sizeof(acr_file_t));
+    if (!fp) {
+        goto cleanup;
+    }
+    fp->fd   = fd;
+    fp->name = ACR_StrdupW(_E, THROW_NMARK, name);
+    rc = acr_ioh_open(fp, ACR_DT_FILE, 0, tmp_file_cleanup);
+    return rc;
+
+cleanup:
+    rc = ACR_GET_OS_ERROR();
+    CloseHandle(fd);
+    DeleteFileW(name);
+    ACR_THROW_IO_IF_ERR(rc);
     return -1;
 }
 
 ACR_DECLARE(wchar_t *) ACR_TempDirMake(JNIEnv *_E, const wchar_t *tmpath,
                                        const wchar_t *prefix)
 {
-    return NULL;
+    int     rc;
+    wchar_t name[ACR_MBUFF_SIZ] = L"";
+
+    if (tmpath) {
+        if (wcslcpy(name, tmpath, TMP_PATH_MAX) >= TMP_PATH_MAX) {
+            ACR_THROW_IO_IF_ERR(ACR_E2BIG);
+            return NULL;
+        }
+        wcslcat(name, L"\\", ACR_MBUFF_SIZ);
+    }
+    wcslcat(name, prefix, ACR_MBUFF_SIZ);
+    if (wcslcat(name, L"XXXXXX", ACR_MBUFF_SIZ) >= ACR_MBUFF_SIZ) {
+        /* Truncation occurred. We dont have enough space
+         * to create temp file template
+         */
+        ACR_THROW_IO_IF_ERR(ACR_E2BIG);
+        return NULL;
+    }
+    rc = getdtemp(name);
+    if (rc < 0) {
+        ACR_THROW_IO_ERRNO();
+        return NULL;
+    }
+    return ACR_StrdupW(_E, THROW_NMARK, name);
 }
 
 ACR_DECLARE(const wchar_t *) ACR_TempPathGet(JNIEnv *_E)