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