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/16 20:49:04 UTC
svn commit: r815925 - in /commons/sandbox/runtime/trunk/src/main/native:
include/acr_signals.h include/arch/unix/acr_arch.h
include/arch/windows/acr_arch_private.h os/win32/main.c os/win32/signals.c
os/win32/wusec.c
Author: mturk
Date: Wed Sep 16 18:49:03 2009
New Revision: 815925
URL: http://svn.apache.org/viewvc?rev=815925&view=rev
Log:
Clear as much as possible on exit
Modified:
commons/sandbox/runtime/trunk/src/main/native/include/acr_signals.h
commons/sandbox/runtime/trunk/src/main/native/include/arch/unix/acr_arch.h
commons/sandbox/runtime/trunk/src/main/native/include/arch/windows/acr_arch_private.h
commons/sandbox/runtime/trunk/src/main/native/os/win32/main.c
commons/sandbox/runtime/trunk/src/main/native/os/win32/signals.c
commons/sandbox/runtime/trunk/src/main/native/os/win32/wusec.c
Modified: commons/sandbox/runtime/trunk/src/main/native/include/acr_signals.h
URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/native/include/acr_signals.h?rev=815925&r1=815924&r2=815925&view=diff
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/native/include/acr_signals.h (original)
+++ commons/sandbox/runtime/trunk/src/main/native/include/acr_signals.h Wed Sep 16 18:49:03 2009
@@ -32,12 +32,6 @@
*/
/**
- * ACR-private function for initializing the signal package
- * @internal
- */
-int acr_SignalsInit(void);
-
-/**
* Get the description for a specific signal number
* @param signum The signal number
* @return The description of the signal
Modified: commons/sandbox/runtime/trunk/src/main/native/include/arch/unix/acr_arch.h
URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/native/include/arch/unix/acr_arch.h?rev=815925&r1=815924&r2=815925&view=diff
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/native/include/arch/unix/acr_arch.h (original)
+++ commons/sandbox/runtime/trunk/src/main/native/include/arch/unix/acr_arch.h Wed Sep 16 18:49:03 2009
@@ -203,6 +203,11 @@
return p;
}
+/* Initialize signal handling subsytem.
+ * ACR private used during init stage
+ */
+int acr_SignalsInit(void);
+
/**
* Read the content of a txt file, up to the ACR_MAX_FREAD_LEN
* and remove all trailing space and control characters.
Modified: commons/sandbox/runtime/trunk/src/main/native/include/arch/windows/acr_arch_private.h
URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/native/include/arch/windows/acr_arch_private.h?rev=815925&r1=815924&r2=815925&view=diff
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/native/include/arch/windows/acr_arch_private.h (original)
+++ commons/sandbox/runtime/trunk/src/main/native/include/arch/windows/acr_arch_private.h Wed Sep 16 18:49:03 2009
@@ -130,6 +130,7 @@
DWORD ACR_EnablePrivilege(LPCWSTR szPrivilege);
PSID ACR_DuplicateSid(JNIEnv *_E, PSID sSID);
int ACR_InitSecurityDescriptorTable(JNIEnv *);
+int ACR_DestroySecurityDescriptorTable(void);
LPVOID ACR_GetSecurityDescriptor(JNIEnv *, DWORD, DWORD, DWORD);
LPVOID ACR_StdSecurityDescriptor(JNIEnv *, int, int);
DWORD ACR_SetSecurityInfo(HANDLE, int, PSID, PSID, int);
@@ -158,6 +159,8 @@
*/
} acr_sig_msg_t;
+int acr_SignalsInit(void);
+int acr_SignalsCleanup(void);
DWORD ACR_DeliverSignals(void);
extern volatile LONG current_signal_listeners;
#define ACR_SIG_WAITER_INIT() InterlockedIncrement(¤t_signal_listeners)
@@ -216,7 +219,7 @@
size_t iov_len; /* Number of bytes */
};
-
+
#if defined(ACR_ENABLE_TEST)
ACR_DECLARE(pid_t) getppid(void);
#else
Modified: commons/sandbox/runtime/trunk/src/main/native/os/win32/main.c
URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/native/os/win32/main.c?rev=815925&r1=815924&r2=815925&view=diff
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/native/os/win32/main.c (original)
+++ commons/sandbox/runtime/trunk/src/main/native/os/win32/main.c Wed Sep 16 18:49:03 2009
@@ -76,6 +76,16 @@
ACR_HeapFree(t);;
}
+static void acr_dll_exit()
+{
+ /* Cleanup persistent memory
+ */
+ acr_SignalsCleanup();
+ ACR_DestroySecurityDescriptorTable();
+ HeapDestroy(dll_heap_handle);
+
+}
+
BOOL WINAPI DllMain(HINSTANCE instance, DWORD reason, LPVOID reserved)
{
ULONG heap_value = 2; /* This enables low fragmentation heap */
@@ -137,7 +147,7 @@
}
TlsFree(dll_tls_index);
}
- HeapDestroy(dll_heap_handle);
+ acr_dll_exit();
dll_instance = NULL;
break;
default:
Modified: commons/sandbox/runtime/trunk/src/main/native/os/win32/signals.c
URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/native/os/win32/signals.c?rev=815925&r1=815924&r2=815925&view=diff
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/native/os/win32/signals.c (original)
+++ commons/sandbox/runtime/trunk/src/main/native/os/win32/signals.c Wed Sep 16 18:49:03 2009
@@ -59,10 +59,11 @@
static SIG_PF signal_handlers[ACR_NUMSIG];
static volatile int running;
-HANDLE sig_raised_event = NULL;
-static HANDLE sig_handle_event = NULL;
+HANDLE sig_raised_event = NULL;
+static HANDLE sig_handle_event = NULL;
+static HANDLE sig_handle_thread = NULL;
-static HANDLE sig_pipe_handle = INVALID_HANDLE_VALUE;
+static HANDLE sig_pipe_handle = INVALID_HANDLE_VALUE;
static wchar_t sig_pipe_name[64];
static BYTE sig_pipe_salt[ACR_SHA1_DIGEST_LENGTH];
static DWORD proc_priority_class = NORMAL_PRIORITY_CLASS;
@@ -73,6 +74,15 @@
HANDLE pipe;
} sig_pipe_data_t;
+static void pre_exit_cleanup()
+{
+ if (IS_VALID_HANDLE(sig_pipe_handle)) {
+ CloseHandle(sig_pipe_handle);
+ sig_pipe_handle = INVALID_HANDLE_VALUE;
+ }
+ sig_handle_thread = NULL;
+}
+
static void make_security_cookie(acr_sig_msg_t *msg, const wchar_t *key,
DWORD sn, DWORD to)
{
@@ -166,6 +176,7 @@
proc_priority_class = dw;
break;
case SIGABRT:
+ pre_exit_cleanup();
#if defined(_MSC_VER) && (_MSC_VER >= 1400)
/* Visual C++ 2005 and later
*/
@@ -175,6 +186,7 @@
break;
case SIGTERM:
case SIGKILL:
+ pre_exit_cleanup();
/* Call the System.exit()
*/
if (ACR_SystemExit(NULL, sig)) {
@@ -194,6 +206,7 @@
fprintf(stderr, "[native] Fatal - %s\n", strsignal(sig));
fprintf(stderr, "[native] Terminating ...\n");
fflush(stderr);
+ pre_exit_cleanup();
ExitProcess(sig);
}
break;
@@ -206,6 +219,7 @@
fprintf(stderr, "[native] Missing JNIEnv - %s\n", strsignal(sig));
fprintf(stderr, "[native] Terminating ...\n");
fflush(stderr);
+ pre_exit_cleanup();
ExitProcess(sig);
}
break;
@@ -311,9 +325,9 @@
/* On Vista+ we can check the client side process id
* and be sure it matches id that was send as part of the
* message.
- */
+ */
if (ACR_HAVE_LATE_DLL_FUNC(GetNamedPipeClientProcessId)) {
- ULONG cpid = 0;
+ ULONG cpid = 0;
if (GetNamedPipeClientProcessId(pd->pipe, &cpid)) {
if (cpid != pd->msg.sender) {
/* Client pretends to be someone else
@@ -443,6 +457,10 @@
while (running) {
rc = WaitForMultipleObjectsEx(nw, wh, FALSE, INFINITE, TRUE);
+ if (!running) {
+ SetEvent(sig_raised_event);
+ break;
+ }
switch (rc) {
case WAIT_OBJECT_0 + 0:
/* Dispatch the event to object waiters
@@ -512,7 +530,6 @@
break;
}
}
-
return 0;
}
@@ -559,7 +576,7 @@
*/
sig_handle_event = CreateEvent(NULL, FALSE, FALSE, NULL);
if (IS_INVALID_HANDLE(sig_handle_event))
- return ACR_GET_OS_ERROR();
+ goto cleanup;
/*
* Create a simple unnamed signaling event.
@@ -572,7 +589,7 @@
*/
sig_raised_event = CreateEvent(NULL, TRUE, FALSE, NULL);
if (IS_INVALID_HANDLE(sig_raised_event))
- return ACR_GET_OS_ERROR();
+ goto cleanup;
for (i = 0; i < ACR_NUMSIG; i++)
@@ -607,9 +624,15 @@
* unstable and will probably crash
* in the near future. Anyhow, return the error.
*/
- return ACR_GET_OS_ERROR();
+ goto cleanup;
}
+ sig_handle_thread = h;
return 0;
+
+cleanup:
+ running = 0;
+ return ACR_GET_OS_ERROR();
+
}
/*
@@ -627,6 +650,9 @@
/* We are invoked from one of the waiters.
*
*/
+
+ if (!running)
+ return ACR_INCOMPLETE;
EnterCriticalSection(&signal_lock);
if (ACR_SIGNAL_NWAITERS() == 0) {
/* Main signal dispatching.
@@ -756,3 +782,19 @@
return 0;
}
+
+int acr_SignalsCleanup(void)
+{
+ if (!running)
+ return ACR_SUCCESS;
+
+ running = 0;
+ SetEvent(sig_raised_event);
+ if (sig_handle_thread) {
+ SetEvent(sig_handle_event);
+ if (WaitForSingleObject(sig_handle_thread, 1000))
+ return ACR_INCOMPLETE;
+ }
+ return ACR_SUCCESS;
+}
+
Modified: commons/sandbox/runtime/trunk/src/main/native/os/win32/wusec.c
URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/native/os/win32/wusec.c?rev=815925&r1=815924&r2=815925&view=diff
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/native/os/win32/wusec.c (original)
+++ commons/sandbox/runtime/trunk/src/main/native/os/win32/wusec.c Wed Sep 16 18:49:03 2009
@@ -315,6 +315,28 @@
return ACR_SUCCESS;
}
+static int security_table_free_callback(int mode, void *opaque,
+ char *key, void *data,
+ acr_size_t dlen)
+{
+ if (mode && data)
+ LocalFree((HLOCAL)data);
+ return 0;
+
+}
+
+int ACR_DestroySecurityDescriptorTable()
+{
+
+ if (!security_table)
+ return ACR_SUCCESS;
+ ACR_TableForEach(security_table, 1, NULL, security_table_free_callback);
+ ACR_TableFree(INVALID_MEMORY_VALUE, THROW_NMARK, security_table);
+ security_table = NULL;
+
+ return ACR_SUCCESS;
+}
+
static struct {
int type;
SE_OBJECT_TYPE krnl;
@@ -584,7 +606,7 @@
_null_sa->nLength = sizeof(SECURITY_ATTRIBUTES);
_null_sa->lpSecurityDescriptor = NULL;
_null_sa->bInheritHandle = FALSE;
-
- SetLastError(rc);
+
+ SetLastError(rc);
return _null_sa;
}