From 119afc377a97d86375466560b8ad538197554b81 Mon Sep 17 00:00:00 2001 From: Tom Tromey <tromey@redhat.com> Date: Tue, 4 Apr 2006 23:25:09 +0000 Subject: [PATCH] re PR classpath/26990 (SecurityManager.checkExit() problem) PR libgcj/26990: * prims.cc (_Jv_RunMain): Use exitNoChecksAccessor. * gnu/java/lang/natMainThread.cc (call_main): Use exitNoChecksAccessor. * testsuite/libjava.lang/pr26990.out: New file. * testsuite/libjava.lang/pr26990.java: New file. * java/lang/Runtime.java (exitNoChecks): New method. (exitNoChecksAccessor): Likewise. (exit): Call exitNoChecks. From-SVN: r112685 --- libjava/ChangeLog | 12 ++++++++++++ libjava/gnu/java/lang/natMainThread.cc | 3 +-- libjava/java/lang/Runtime.java | 15 +++++++++++++-- libjava/prims.cc | 2 +- libjava/testsuite/libjava.lang/pr26990.java | 13 +++++++++++++ libjava/testsuite/libjava.lang/pr26990.out | 0 6 files changed, 40 insertions(+), 5 deletions(-) create mode 100644 libjava/testsuite/libjava.lang/pr26990.java create mode 100644 libjava/testsuite/libjava.lang/pr26990.out diff --git a/libjava/ChangeLog b/libjava/ChangeLog index ce599c137646..28b41f40ca1e 100644 --- a/libjava/ChangeLog +++ b/libjava/ChangeLog @@ -1,3 +1,15 @@ +2006-04-04 Tom Tromey <tromey@redhat.com> + + PR libgcj/26990: + * prims.cc (_Jv_RunMain): Use exitNoChecksAccessor. + * gnu/java/lang/natMainThread.cc (call_main): Use + exitNoChecksAccessor. + * testsuite/libjava.lang/pr26990.out: New file. + * testsuite/libjava.lang/pr26990.java: New file. + * java/lang/Runtime.java (exitNoChecks): New method. + (exitNoChecksAccessor): Likewise. + (exit): Call exitNoChecks. + 2006-04-03 Tom Tromey <tromey@redhat.com> * Makefile.in: Rebuilt. diff --git a/libjava/gnu/java/lang/natMainThread.cc b/libjava/gnu/java/lang/natMainThread.cc index 95626eb3a71a..99d5f95ffdeb 100644 --- a/libjava/gnu/java/lang/natMainThread.cc +++ b/libjava/gnu/java/lang/natMainThread.cc @@ -57,6 +57,5 @@ gnu::java::lang::MainThread::call_main (void) _Jv_ThreadWait (); int status = (int) ::java::lang::ThreadGroup::had_uncaught_exception; - ::java::lang::Runtime *runtime = ::java::lang::Runtime::getRuntime (); - runtime->exit (status); + ::java::lang::Runtime::exitNoChecksAccessor (status); } diff --git a/libjava/java/lang/Runtime.java b/libjava/java/lang/Runtime.java index 519b4ac8c5ef..3466f19f2a00 100644 --- a/libjava/java/lang/Runtime.java +++ b/libjava/java/lang/Runtime.java @@ -146,9 +146,20 @@ public class Runtime SecurityManager sm = SecurityManager.current; // Be thread-safe! if (sm != null) sm.checkExit(status); + exitNoChecks(status); + } + // Accessor to avoid adding a vtable slot. + static void exitNoChecksAccessor(int status) + { + current.exitNoChecks(status); + } + + // Private since we can't add a vtable slot in 4.1.x. + private void exitNoChecks(int status) + { if (runShutdownHooks()) - halt(status); + exitInternal(status); // Someone else already called runShutdownHooks(). // Make sure we are not/no longer in the shutdownHooks set. @@ -171,7 +182,7 @@ public class Runtime // while finalization for exit is going on and the status is non-zero // we halt immediately. if (status != 0) - halt(status); + exitInternal(status); while (true) try diff --git a/libjava/prims.cc b/libjava/prims.cc index 1ef56742398d..5e016c94c783 100644 --- a/libjava/prims.cc +++ b/libjava/prims.cc @@ -1525,7 +1525,7 @@ _Jv_RunMain (JvVMInitArgs *vm_args, jclass klass, const char *name, int argc, ("Exception during runtime initialization")); t->printStackTrace(); if (runtime) - runtime->exit (1); + java::lang::Runtime::exitNoChecksAccessor (1); // In case the runtime creation failed. ::exit (1); } diff --git a/libjava/testsuite/libjava.lang/pr26990.java b/libjava/testsuite/libjava.lang/pr26990.java new file mode 100644 index 000000000000..88db93e3e12e --- /dev/null +++ b/libjava/testsuite/libjava.lang/pr26990.java @@ -0,0 +1,13 @@ +public class pr26990 +{ + public static void main (String args[]) throws Exception + { + System.setSecurityManager(new SecurityManager() + { + public void checkExit(int status) + { + throw new SecurityException("This is a bug"); + } + }); + } +} diff --git a/libjava/testsuite/libjava.lang/pr26990.out b/libjava/testsuite/libjava.lang/pr26990.out new file mode 100644 index 000000000000..e69de29bb2d1 -- GitLab