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/06/17 09:15:23 UTC
svn commit: r785489 - in /commons/sandbox/runtime/trunk/src:
main/java/org/apache/commons/runtime/
main/java/org/apache/commons/runtime/io/ main/native/ main/native/include/
main/native/shared/ main/native/test/ test/org/apache/commons/runtime/
Author: mturk
Date: Wed Jun 17 07:15:23 2009
New Revision: 785489
URL: http://svn.apache.org/viewvc?rev=785489&view=rev
Log:
Add exception handling, so we don't crash the JVM is we write to invalid memory location
Modified:
commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/Native.java
commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/io/File.java
commons/sandbox/runtime/trunk/src/main/native/configure
commons/sandbox/runtime/trunk/src/main/native/include/acr_error.h
commons/sandbox/runtime/trunk/src/main/native/shared/error.c
commons/sandbox/runtime/trunk/src/main/native/shared/native.c
commons/sandbox/runtime/trunk/src/main/native/test/testcase.c
commons/sandbox/runtime/trunk/src/test/org/apache/commons/runtime/TestPrivate.java
Modified: commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/Native.java
URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/Native.java?rev=785489&r1=785488&r2=785489&view=diff
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/Native.java (original)
+++ commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/Native.java Wed Jun 17 07:15:23 2009
@@ -34,6 +34,7 @@
private static boolean initialized = false;
private static native boolean init0()
throws Throwable;
+ private static native void sseh0(boolean on);
/**
* Initialize Apache Commons Runtime native library.
@@ -60,4 +61,17 @@
}
return initialized;
}
+
+ public static void enableExceptionHandler()
+ throws Throwable
+ {
+ sseh0(true);
+ }
+
+ public static void disableExceptionHandler()
+ throws Throwable
+ {
+ sseh0(false);
+ }
+
}
Modified: commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/io/File.java
URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/io/File.java?rev=785489&r1=785488&r2=785489&view=diff
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/io/File.java (original)
+++ commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/io/File.java Wed Jun 17 07:15:23 2009
@@ -54,7 +54,7 @@
private static native boolean attrs0(String pathname, int attr, int mask)
throws IOException, SecurityException;
- // Catched FileType Enum integer value.
+ // Cached FileType Enum integer value.
private int fileType = -1;
/* Private constructor used from native code
@@ -264,9 +264,7 @@
{
if (fileType < 0)
fileType = ftype0(getPath());
- // XXX: The value should be obtained directly from
- // FileType Enum.
- return fileType == 6;
+ return fileType == FileType.LNK.valueOf();
}
/**
@@ -352,7 +350,7 @@
// Check is made wather it points to the same target
mkslink0(getPath(), link);
if (getPath().equals(target0(link))) {
- return new File(link, 6);
+ return new File(link, FileType.LNK.valueOf());
}
else {
throw new IOException("Symlink exists and points to a different path");
Modified: commons/sandbox/runtime/trunk/src/main/native/configure
URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/native/configure?rev=785489&r1=785488&r2=785489&view=diff
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/native/configure (original)
+++ commons/sandbox/runtime/trunk/src/main/native/configure Wed Jun 17 07:15:23 2009
@@ -504,23 +504,24 @@
echo $rc
}
-have_function()
+have_function_body()
{
- printf "Checking for %-32s" "$1" 1>&2
cat > $test.c << EOF
+#define $1 wrapper_$1
#ifdef __STDC__
#include <limits.h>
#else
#include <assert.h>
#endif
-char $1 ();
+#undef $1
#if defined __stub_$1 || defined __stub___$1
choke me
#endif
-int main() { return (int) $1 ();}
+char $1 ();
+int main() { return $1 (); }
EOF
rc=0
- co="`$cc $ccflags $cppopts $test.c -o $test$exe 2>&1`"
+ co="`$cc $ccflags $cppopts $ldflags $test.c -o $test$exe 2>&1`"
if [ ".$co" = "." ]; then
rc=1
else
@@ -529,6 +530,16 @@
fi
fi
rm -rf $test.* $test *.pdb >/dev/null 2>&1 || true
+ echo $rc
+}
+
+have_function()
+{
+ printf "Checking for %-32s" "$1" 1>&2
+ rc=`have_function_body $1 $2`
+ if [ $rc = 0 ]; then
+ rc=`have_function_body __$1 $2`
+ fi
if [ $rc = 1 ]; then
echo ok 1>&2
else
@@ -576,7 +587,7 @@
int main() {printf("%d", sizeof($1));return 0;}
EOF
rc=""
- $cc $ccflags $cppopts $test.c -o $test$exe >/dev/null 2>&1
+ $cc $ccflags $cppopts $ldflags $test.c -o $test$exe >/dev/null 2>&1
if [ -x $test$exe ]; then
rc=`./$test$exe 2>/dev/null`
fi
@@ -690,6 +701,7 @@
#define HAVE_ACCEPT4 `have_function accept4`
#define HAVE_DUP3 `have_function dup3`
#define HAVE_EPOLL_CREATE1 `have_function epoll_create1`
+#define HAVE_SIGSETJMP `have_function sigsetjmp`
#define HAVE_SOCK_CLOEXEC `have_sock_cloexec`
#define HAVE_OFF64_T $have_off64t
#define HAVE_LONG_LONG $have_long_long
Modified: commons/sandbox/runtime/trunk/src/main/native/include/acr_error.h
URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/native/include/acr_error.h?rev=785489&r1=785488&r2=785489&view=diff
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/native/include/acr_error.h (original)
+++ commons/sandbox/runtime/trunk/src/main/native/include/acr_error.h Wed Jun 17 07:15:23 2009
@@ -58,6 +58,78 @@
ACR_EX_LEN
} acr_trowclass_e;
+typedef enum {
+ ACR_SEH_NONE = 0,
+ ACR_SEH_CONTINUE,
+ ACR_SEH_THROW
+} acr_seh_e;
+
+#ifdef ACR_WANT_MEMPROTECT
+#ifdef _MSC_VER
+#define SEH_ERROR GetExceptionCode()
+#define ACR_TRY \
+ int _seh_error = 0; \
+ if (ACR_GetExceptionHandlerMode() != ACR_SEH_NONE) \
+ _seh_error = 1; \
+ __try {
+
+#define ACR_CATCH() \
+ } __except(_seh_error ? EXCEPTION_EXECUTE_HANDLER : \
+ EXCEPTION_CONTINUE_SEARCH)
+
+#else
+#include <signal.h>
+#include <setjmp.h>
+#define SEH_ERROR _seh_error
+
+#if HAVE_SIGSETJMP
+#define SEH_SETJMP(E) sigsetjmp((E), 0)
+#define SEH_DOJUMP(E, V) siglongjmp((E), (V))
+#define SEH_JMPBUF sigjmp_buf
+#else
+#define SEH_SETJMP(E) setjmp((E))
+#define SEH_DOJUMP(E, V) longjmp((E), (V))
+#define SEH_JMPBUF jmp_buf
+#endif
+static SEH_JMPBUF _seh_catch;
+static void _seh_handler(int val)
+{
+ if (val == SIGSEGV || val == SIGBUS) {
+ SEH_DOJUMP(_seh_catch, val);
+ }
+}
+
+#define ACR_TRY \
+ int _seh_error = 0; \
+ { \
+ void* _org_sigseg_handler = NULL; \
+ void* _org_sigbus_handler = NULL; \
+ int _org_setjmp_handler = 0; \
+ if (ACR_GetExceptionHandlerMode() != ACR_SEH_NONE) { \
+ _org_sigseg_handler = signal(SIGSEGV, _seh_handler); \
+ _org_sigbus_handler = signal(SIGBUS, _seh_handler); \
+ _org_setjmp_handler = 1; \
+ if ((_seh_error = SEH_SETJMP(_seh_catch))) \
+ goto _seh_catch_block; \
+ }
+
+#define ACR_CATCH() \
+_seh_catch_block: \
+ if (_org_setjmp_handler) { \
+ signal(SIGSEGV, _org_sigseg_handler); \
+ signal(SIGBUS, _org_sigbus_handler); \
+ } } if (_seh_error)
+
+#endif
+#else
+#define ACR_TRY \
+ int _seh_error = 0; \
+ { \
+#define ACR_CATCH() \
+ } } if (_seh_error)
+
+#endif /* HAVE_MEMPROTECT */
+
/*
* Convenience function to help throw any class
* @param env JNI Environment
@@ -111,7 +183,7 @@
/**
* @defgroup apr_errno Error Codes
- * @ingroup ACR
+ * @ingroup ACR
* @{
*/
@@ -121,9 +193,21 @@
* @param buf A buffer to hold the error string.
* @param bufsize Size of the buffer to hold the string.
*/
-ACR_DECLARE(char *) ACR_GetErrorString(int statcode, char *buf,
+ACR_DECLARE(char *) ACR_GetErrorString(int statcode, char *buf,
acr_size_t bufsize);
+/**
+ * Set internal memory protection exception handling mode.
+ * @param mode Exception handling mode.
+ */
+ACR_DECLARE(void) ACR_SetExceptionHandlerMode(acr_seh_e mode);
+
+/**
+ * Get the exception handling mode.
+ * @return Previously set exception handling mode.
+ */
+ACR_DECLARE(acr_seh_e) ACR_GetExceptionHandlerMode(void);
+
#if defined(DOXYGEN)
/**
* @def ACR_FROM_OS_ERROR(os_err_type syserr)
@@ -141,7 +225,7 @@
* Fold an apr_status_t code back to the native platform defined error.
* @param e The apr_status_t folded platform os error code.
* @warning macro implementation; the statcode argument may be evaluated
- * multiple times. If the statcode was not created by apr_get_os_error
+ * multiple times. If the statcode was not created by apr_get_os_error
* or ACR_FROM_OS_ERROR, the results are undefined.
*/
#define ACR_TO_OS_ERROR(e) (e == 0 ? ACR_SUCCESS : e - ACR_OS_START_SYSERR)
@@ -177,7 +261,7 @@
* @warning This is a macro implementation; the statcode argument may be evaluated
* multiple times. If the statcode was not created by apr_get_os_error
* or ACR_FROM_OS_ERROR, the results are undefined. This macro sets
- * errno, or calls a WSASetLastError() style function, unfolding
+ * errno, or calls a WSASetLastError() style function, unfolding
* socketcode with ACR_TO_OS_ERROR.
*/
@@ -186,13 +270,13 @@
/**
* ACR_OS_START_ERROR is where the ACR specific error values start.
*/
-#define ACR_OS_START_ERROR 20000
+#define ACR_OS_START_ERROR 20000
/**
* ACR_OS_ERRSPACE_SIZE is the maximum number of errors you can fit
* into one of the error/status ranges below -- except for
* ACR_OS_START_USERERR, which see.
*/
-#define ACR_OS_ERRSPACE_SIZE 50000
+#define ACR_OS_ERRSPACE_SIZE 50000
/**
* ACR_UTIL_ERRSPACE_SIZE is the size of the space that is reserved for
* use within apr-util. This space is reserved above that used by ACR
@@ -201,7 +285,7 @@
* large enough amount that ACR has sufficient room for it's
* codes.
*/
-#define ACR_UTIL_ERRSPACE_SIZE 20000
+#define ACR_UTIL_ERRSPACE_SIZE 20000
/**
* ACR_OS_START_STATUS is where the ACR specific status codes start.
*/
@@ -221,7 +305,7 @@
*
* In general applications should try and create unique error codes. To try
* and assist in finding suitable ranges of numbers to use, the following
- * ranges are known to be used by the listed applications. If your
+ * ranges are known to be used by the listed applications. If your
* application defines error codes please advise the range of numbers it
* uses to dev@apr.apache.org for inclusion in this list.
*
@@ -244,12 +328,12 @@
#define ACR_OS_START_CANONERR (ACR_OS_START_USERERR \
+ (ACR_OS_ERRSPACE_SIZE * 10))
/**
- * ACR_OS_START_EAIERR folds EAI_ error codes from getaddrinfo() into
+ * ACR_OS_START_EAIERR folds EAI_ error codes from getaddrinfo() into
* apr_status_t values.
*/
#define ACR_OS_START_EAIERR (ACR_OS_START_CANONERR + ACR_OS_ERRSPACE_SIZE)
/**
- * ACR_OS_START_SYSERR folds platform-specific system error values into
+ * ACR_OS_START_SYSERR folds platform-specific system error values into
* apr_status_t values.
*/
#define ACR_OS_START_SYSERR (ACR_OS_START_EAIERR + ACR_OS_ERRSPACE_SIZE)
@@ -260,7 +344,7 @@
* The following attempts to show the relation of the various constants
* used for mapping ACR Status codes.
*
- * 0
+ * 0
*
* 20,000 ACR_OS_START_ERROR
*
@@ -294,13 +378,13 @@
/** no error. */
#define ACR_SUCCESS 0
-/**
+/**
* @defgroup ACR_Error ACR Error Values
* <PRE>
* <b>ACR ERROR VALUES</b>
- * ACR_ENOSTAT ACR was unable to perform a stat on the file
+ * ACR_ENOSTAT ACR was unable to perform a stat on the file
* ACR_ENOPOOL ACR was not provided a pool with which to allocate memory
- * ACR_EBADDATE ACR was given an invalid date
+ * ACR_EBADDATE ACR was given an invalid date
* ACR_EINVALSOCK ACR was given an invalid socket
* ACR_ENOPROC ACR was not given a process structure
* ACR_ENOTIME ACR was not given a time structure
@@ -311,7 +395,7 @@
* ACR_ENOTHREAD ACR was not given a thread structure
* ACR_ENOTHDKEY ACR was not given a thread key structure
* ACR_ENOSHMAVAIL There is no more shared memory available
- * ACR_EDSOOPEN ACR was unable to open the dso object. For more
+ * ACR_EDSOOPEN ACR was unable to open the dso object. For more
* information call apr_dso_error().
* ACR_EGENERAL General failure (specific information not available)
* ACR_EBADIP The specified IP address is invalid
@@ -332,17 +416,17 @@
* ACR_INCOMPLETE The operation was incomplete although some processing
* was performed and the results are partially valid
* ACR_BADCH Getopt found an option not in the option string
- * ACR_BADARG Getopt found an option that is missing an argument
+ * ACR_BADARG Getopt found an option that is missing an argument
* and an argument was specified in the option string
* ACR_EOF ACR has encountered the end of the file
* ACR_NOTFOUND ACR was unable to find the socket in the poll structure
* ACR_ANONYMOUS ACR is using anonymous shared memory
* ACR_FILEBASED ACR is using a file name as the key to the shared memory
* ACR_KEYBASED ACR is using a shared key as the key to the shared memory
- * ACR_EINIT Ininitalizer value. If no option has been found, but
+ * ACR_EINIT Ininitalizer value. If no option has been found, but
* the status variable requires a value, this should be used
- * ACR_ENOTIMPL The ACR function has not been implemented on this
- * platform, either because nobody has gotten to it yet,
+ * ACR_ENOTIMPL The ACR function has not been implemented on this
+ * platform, either because nobody has gotten to it yet,
* or the function is impossible on this platform.
* ACR_EMISMATCH Two passwords do not match.
* ACR_EABSOLUTE The given path was absolute.
@@ -416,7 +500,7 @@
#define ACR_ERANGE (ACR_OS_START_ERROR + 102)
#define ACR_ECLASSNOTFOUND (ACR_OS_START_ERROR + 103)
-/**
+/**
* @defgroup ACR_STATUS_IS Status Value Tests
* @warning For any particular error condition, more than one of these tests
* may match. This is because platform-specific error codes may not
@@ -427,16 +511,16 @@
* adjust the order of the tests accordingly.
* @{
*/
-/**
- * ACR was unable to perform a stat on the file
+/**
+ * ACR was unable to perform a stat on the file
* @warning always use this test, as platform-specific variances may meet this
- * more than one error code
+ * more than one error code
*/
#define ACR_STATUS_IS_ENOSTAT(s) ((s) == ACR_ENOSTAT)
-/**
- * ACR was not provided a pool with which to allocate memory
+/**
+ * ACR was not provided a pool with which to allocate memory
* @warning always use this test, as platform-specific variances may meet this
- * more than one error code
+ * more than one error code
*/
#define ACR_STATUS_IS_ENOPOOL(s) ((s) == ACR_ENOPOOL)
/** ACR was given an invalid date */
@@ -468,8 +552,8 @@
/** The specified netmask is invalid */
#define ACR_STATUS_IS_EBADMASK(s) ((s) == ACR_EBADMASK)
/* empty slot: +18 */
-/**
- * ACR was unable to open the dso object.
+/**
+ * ACR was unable to open the dso object.
* For more information call apr_dso_error().
*/
#if defined(WIN32)
@@ -506,7 +590,7 @@
/** @} */
-/**
+/**
* @addtogroup ACR_Error
* @{
*/
@@ -547,7 +631,7 @@
/** @see ACR_STATUS_IS_KEYBASED */
#define ACR_KEYBASED (ACR_OS_START_STATUS + 21)
/** @see ACR_STATUS_IS_EINIT */
-#define ACR_EINIT (ACR_OS_START_STATUS + 22)
+#define ACR_EINIT (ACR_OS_START_STATUS + 22)
/** @see ACR_STATUS_IS_ENOTIMPL */
#define ACR_ENOTIMPL (ACR_OS_START_STATUS + 23)
/** @see ACR_STATUS_IS_EMISMATCH */
@@ -556,156 +640,156 @@
#define ACR_EBUSY (ACR_OS_START_STATUS + 25)
/** @} */
-/**
+/**
* @addtogroup ACR_STATUS_IS
* @{
*/
-/**
- * Program is currently executing in the child
+/**
+ * Program is currently executing in the child
* @warning
* always use this test, as platform-specific variances may meet this
* more than one error code */
#define ACR_STATUS_IS_INCHILD(s) ((s) == ACR_INCHILD)
-/**
- * Program is currently executing in the parent
+/**
+ * Program is currently executing in the parent
* @warning
* always use this test, as platform-specific variances may meet this
- * more than one error code
+ * more than one error code
*/
#define ACR_STATUS_IS_INPARENT(s) ((s) == ACR_INPARENT)
-/**
- * The thread is detached
+/**
+ * The thread is detached
* @warning
* always use this test, as platform-specific variances may meet this
- * more than one error code
+ * more than one error code
*/
#define ACR_STATUS_IS_DETACH(s) ((s) == ACR_DETACH)
-/**
- * The thread is not detached
+/**
+ * The thread is not detached
* @warning
* always use this test, as platform-specific variances may meet this
- * more than one error code
+ * more than one error code
*/
#define ACR_STATUS_IS_NOTDETACH(s) ((s) == ACR_NOTDETACH)
-/**
+/**
* The child has finished executing
* @warning
* always use this test, as platform-specific variances may meet this
- * more than one error code
+ * more than one error code
*/
#define ACR_STATUS_IS_CHILD_DONE(s) ((s) == ACR_CHILD_DONE)
-/**
+/**
* The child has not finished executing
* @warning
* always use this test, as platform-specific variances may meet this
- * more than one error code
+ * more than one error code
*/
#define ACR_STATUS_IS_CHILD_NOTDONE(s) ((s) == ACR_CHILD_NOTDONE)
-/**
+/**
* The operation did not finish before the timeout
* @warning
* always use this test, as platform-specific variances may meet this
- * more than one error code
+ * more than one error code
*/
#define ACR_STATUS_IS_TIMEUP(s) ((s) == ACR_TIMEUP)
-/**
+/**
* The operation was incomplete although some processing was performed
* and the results are partially valid.
* @warning
* always use this test, as platform-specific variances may meet this
- * more than one error code
+ * more than one error code
*/
#define ACR_STATUS_IS_INCOMPLETE(s) ((s) == ACR_INCOMPLETE)
/* empty slot: +9 */
/* empty slot: +10 */
/* empty slot: +11 */
-/**
+/**
* Getopt found an option not in the option string
* @warning
* always use this test, as platform-specific variances may meet this
- * more than one error code
+ * more than one error code
*/
#define ACR_STATUS_IS_BADCH(s) ((s) == ACR_BADCH)
-/**
- * Getopt found an option not in the option string and an argument was
+/**
+ * Getopt found an option not in the option string and an argument was
* specified in the option string
* @warning
* always use this test, as platform-specific variances may meet this
- * more than one error code
+ * more than one error code
*/
#define ACR_STATUS_IS_BADARG(s) ((s) == ACR_BADARG)
-/**
+/**
* ACR has encountered the end of the file
* @warning
* always use this test, as platform-specific variances may meet this
- * more than one error code
+ * more than one error code
*/
#define ACR_STATUS_IS_EOF(s) ((s) == ACR_EOF)
-/**
+/**
* ACR was unable to find the socket in the poll structure
* @warning
* always use this test, as platform-specific variances may meet this
- * more than one error code
+ * more than one error code
*/
#define ACR_STATUS_IS_NOTFOUND(s) ((s) == ACR_NOTFOUND)
/* empty slot: +16 */
/* empty slot: +17 */
/* empty slot: +18 */
-/**
+/**
* ACR is using anonymous shared memory
* @warning
* always use this test, as platform-specific variances may meet this
- * more than one error code
+ * more than one error code
*/
#define ACR_STATUS_IS_ANONYMOUS(s) ((s) == ACR_ANONYMOUS)
-/**
+/**
* ACR is using a file name as the key to the shared memory
* @warning
* always use this test, as platform-specific variances may meet this
- * more than one error code
+ * more than one error code
*/
#define ACR_STATUS_IS_FILEBASED(s) ((s) == ACR_FILEBASED)
-/**
+/**
* ACR is using a shared key as the key to the shared memory
* @warning
* always use this test, as platform-specific variances may meet this
- * more than one error code
+ * more than one error code
*/
#define ACR_STATUS_IS_KEYBASED(s) ((s) == ACR_KEYBASED)
-/**
- * Ininitalizer value. If no option has been found, but
+/**
+ * Ininitalizer value. If no option has been found, but
* the status variable requires a value, this should be used
* @warning
* always use this test, as platform-specific variances may meet this
- * more than one error code
+ * more than one error code
*/
#define ACR_STATUS_IS_EINIT(s) ((s) == ACR_EINIT)
-/**
- * The ACR function has not been implemented on this
- * platform, either because nobody has gotten to it yet,
+/**
+ * The ACR function has not been implemented on this
+ * platform, either because nobody has gotten to it yet,
* or the function is impossible on this platform.
* @warning
* always use this test, as platform-specific variances may meet this
- * more than one error code
+ * more than one error code
*/
#define ACR_STATUS_IS_ENOTIMPL(s) ((s) == ACR_ENOTIMPL)
-/**
+/**
* Two passwords do not match.
* @warning
* always use this test, as platform-specific variances may meet this
- * more than one error code
+ * more than one error code
*/
#define ACR_STATUS_IS_EMISMATCH(s) ((s) == ACR_EMISMATCH)
-/**
+/**
* The given lock was busy
* @warning always use this test, as platform-specific variances may meet this
- * more than one error code
+ * more than one error code
*/
#define ACR_STATUS_IS_EBUSY(s) ((s) == ACR_EBUSY)
/** @} */
-/**
+/**
* @addtogroup ACR_Error ACR Error Values
* @{
*/
@@ -794,8 +878,8 @@
#define ACR_ESPIPE (ACR_OS_START_CANONERR + 12)
#endif
-/**
- * @see ACR_STATUS_IS_EAGAIN
+/**
+ * @see ACR_STATUS_IS_EAGAIN
* @warning use ACR_STATUS_IS_EAGAIN instead of just testing this value
*/
#ifdef EAGAIN
@@ -834,7 +918,7 @@
#define ACR_EINPROGRESS (ACR_OS_START_CANONERR + 17)
#endif
-/**
+/**
* @see ACR_STATUS_IS_ECONNABORTED
* @warning use ACR_STATUS_IS_ECONNABORTED instead of just testing this value
*/
@@ -1031,7 +1115,7 @@
#define ACR_GET_NETOS_ERROR() (errno)
#define ACR_SET_NETOS_ERROR(e) (errno = (e))
-/**
+/**
* @addtogroup ACR_STATUS_IS
* @{
*/
@@ -1095,15 +1179,15 @@
/** operation now in progress */
#define ACR_STATUS_IS_EINPROGRESS(s) ((s) == ACR_EINPROGRESS)
-/**
- * Software caused connection abort
+/**
+ * Software caused connection abort
* @remark
- * EPROTO on certain older kernels really means ECONNABORTED, so we need to
+ * EPROTO on certain older kernels really means ECONNABORTED, so we need to
* ignore it for them. See discussion in new-httpd archives nh.9701 & nh.9603
*
- * There is potentially a bug in Solaris 2.x x<6, and other boxes that
+ * There is potentially a bug in Solaris 2.x x<6, and other boxes that
* implement tcp sockets in userland (i.e. on top of STREAMS). On these
- * systems, EPROTO can actually result in a fatal loop. See PR#981 for
+ * systems, EPROTO can actually result in a fatal loop. See PR#981 for
* example. It's hard to handle both uses of EPROTO.
*/
#ifdef EPROTO
Modified: commons/sandbox/runtime/trunk/src/main/native/shared/error.c
URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/native/shared/error.c?rev=785489&r1=785488&r2=785489&view=diff
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/native/shared/error.c (original)
+++ commons/sandbox/runtime/trunk/src/main/native/shared/error.c Wed Jun 17 07:15:23 2009
@@ -44,6 +44,7 @@
NULL
};
+static acr_seh_e acr_seh_mode = ACR_SEH_NONE;
/*
* Convenience function to help throw any class
@@ -486,6 +487,16 @@
}
}
+ACR_DECLARE(void) ACR_SetExceptionHandlerMode(acr_seh_e mode)
+{
+ acr_seh_mode = mode;
+}
+
+ACR_DECLARE(acr_seh_e) ACR_GetExceptionHandlerMode()
+{
+ return acr_seh_mode;
+}
+
ACR_JNI_EXPORT_DECLARE(void, io_Status, init0)(ACR_JNISTDARGS,
jintArray ra)
{
Modified: commons/sandbox/runtime/trunk/src/main/native/shared/native.c
URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/native/shared/native.c?rev=785489&r1=785488&r2=785489&view=diff
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/native/shared/native.c (original)
+++ commons/sandbox/runtime/trunk/src/main/native/shared/native.c Wed Jun 17 07:15:23 2009
@@ -34,3 +34,8 @@
return rv;
}
+
+ACR_JNI_EXPORT_DECLARE(void, Native, sseh0)(ACR_JNISTDARGS, jboolean on)
+{
+ ACR_SetExceptionHandlerMode(on ? ACR_SEH_THROW : ACR_SEH_NONE);
+}
Modified: commons/sandbox/runtime/trunk/src/main/native/test/testcase.c
URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/native/test/testcase.c?rev=785489&r1=785488&r2=785489&view=diff
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/native/test/testcase.c (original)
+++ commons/sandbox/runtime/trunk/src/main/native/test/testcase.c Wed Jun 17 07:15:23 2009
@@ -17,6 +17,7 @@
#include "acr.h"
#include "acr_private.h"
#include "acr_arch.h"
+#define ACR_WANT_MEMPROTECT
#include "acr_error.h"
#include "acr_string.h"
#include "acr_memory.h"
@@ -315,6 +316,16 @@
return ACR_IoFileObjectCreate(_E, _PTEXT("/tmp/foo"), -1);
}
+ACR_JNI_EXPORT_DECLARE(void, TestPrivate, test030)(ACR_JNISTDARGS, int d)
+{
+ ACR_TRY {
+ void *p = NULL;
+ memset(p, 1, 100);
+ } ACR_CATCH() {
+ ACR_ThrowException(_E, THROW_NMARK, ACR_EX_ERUNTIME, EFAULT);
+ }
+}
+
ACR_JNI_EXPORT_DECLARE(jint, TestFile, ftest00)(ACR_JNISTDARGS, jint d)
{
Modified: commons/sandbox/runtime/trunk/src/test/org/apache/commons/runtime/TestPrivate.java
URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/test/org/apache/commons/runtime/TestPrivate.java?rev=785489&r1=785488&r2=785489&view=diff
==============================================================================
--- commons/sandbox/runtime/trunk/src/test/org/apache/commons/runtime/TestPrivate.java (original)
+++ commons/sandbox/runtime/trunk/src/test/org/apache/commons/runtime/TestPrivate.java Wed Jun 17 07:15:23 2009
@@ -79,6 +79,7 @@
private static native String test028(int d);
private static native File test029(int d);
+ private static native void test030(int d);
private static native String test100(String s);
@@ -583,6 +584,19 @@
assertEquals("Name", "foo", f.getName());
}
+ public void testMempotect()
+ throws Throwable
+ {
+ Native.enableExceptionHandler();
+ try {
+ test030(0);
+ fail("Exception not thrown");
+ } catch (Throwable t) {
+ assertSame("Wrong Exception class",
+ java.lang.RuntimeException.class, t.getClass());
+ }
+ }
+
public void testModuleSSL()
throws Throwable
{