6545149: 4/4 JLI Instrumentation.redefineClasses SIGSEGVs on java/lang/Thread
Summary: Add regression test for redefining class with native methods.
Reviewed-by: sspitsyn
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/lang/instrument/RedefineClassWithNativeMethod.sh Mon Mar 24 16:11:24 2008 -0700
@@ -0,0 +1,81 @@
+#
+# Copyright 2008 Sun Microsystems, Inc. All Rights Reserved.
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+#
+# This code is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License version 2 only, as
+# published by the Free Software Foundation.
+#
+# This code is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+# version 2 for more details (a copy is included in the LICENSE file that
+# accompanied this code).
+#
+# You should have received a copy of the GNU General Public License version
+# 2 along with this work; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+#
+# Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+# CA 95054 USA or visit www.sun.com if you need additional information or
+# have any questions.
+#
+
+# @test
+# @bug 5003341 4917140 6545149
+# @summary Redefine a class with a native method.
+# @author Daniel D. Daugherty as modified from the test submitted by clovis@par.univie.ac.at
+#
+# @run shell MakeJAR3.sh RedefineClassWithNativeMethodAgent 'Can-Redefine-Classes: true'
+# @run build RedefineClassWithNativeMethodApp
+# @run shell RedefineClassWithNativeMethod.sh
+#
+
+if [ "${TESTJAVA}" = "" ]
+then
+ echo "TESTJAVA not set. Test cannot execute. Failed."
+ exit 1
+fi
+
+if [ "${TESTSRC}" = "" ]
+then
+ echo "TESTSRC not set. Test cannot execute. Failed."
+ exit 1
+fi
+
+if [ "${TESTCLASSES}" = "" ]
+then
+ echo "TESTCLASSES not set. Test cannot execute. Failed."
+ exit 1
+fi
+
+JAVAC="${TESTJAVA}"/bin/javac
+JAVA="${TESTJAVA}"/bin/java
+
+"${JAVA}" ${TESTVMOPTS} \
+ -javaagent:RedefineClassWithNativeMethodAgent.jar=java/lang/Thread.class \
+ -classpath "${TESTCLASSES}" RedefineClassWithNativeMethodApp \
+ > output.log 2>&1
+result=$?
+
+cat output.log
+
+if [ "$result" = 0 ]; then
+ echo "PASS: RedefineClassWithNativeMethodApp exited with status of 0."
+else
+ echo "FAIL: RedefineClassWithNativeMethodApp exited with status of $result"
+ exit "$result"
+fi
+
+MESG="Exception"
+grep "$MESG" output.log
+result=$?
+if [ "$result" = 0 ]; then
+ echo "FAIL: found '$MESG' in the test output"
+ result=1
+else
+ echo "PASS: did NOT find '$MESG' in the test output"
+ result=0
+fi
+
+exit $result
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/lang/instrument/RedefineClassWithNativeMethodAgent.java Mon Mar 24 16:11:24 2008 -0700
@@ -0,0 +1,70 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+import java.lang.instrument.*;
+import java.net.*;
+import java.util.*;
+import java.io.*;
+
+public class RedefineClassWithNativeMethodAgent {
+ static Class clz;
+
+ // just read the original class and redefine it via a Timer
+ public static void premain(String agentArgs, final Instrumentation inst) throws Exception {
+ String s = agentArgs.substring(0, agentArgs.indexOf(".class"));
+ clz = Class.forName(s.replace('/', '.'));
+ ClassLoader loader =
+ RedefineClassWithNativeMethodAgent.class.getClassLoader();
+ URL classURL = loader.getResource(agentArgs);
+ if (classURL == null) {
+ throw new Exception("Cannot find class: " + agentArgs);
+ }
+
+ int redefineLength;
+ InputStream redefineStream;
+
+ System.out.println("Reading test class from " + classURL);
+ if (classURL.getProtocol().equals("file")) {
+ File f = new File(classURL.getFile());
+ redefineStream = new FileInputStream(f);
+ redefineLength = (int) f.length();
+ } else {
+ URLConnection conn = classURL.openConnection();
+ redefineStream = conn.getInputStream();
+ redefineLength = conn.getContentLength();
+ }
+
+ final byte[] buffer = new byte[redefineLength];
+ new BufferedInputStream(redefineStream).read(buffer);
+ new Timer(true).schedule(new TimerTask() {
+ public void run() {
+ try {
+ System.out.println("Instrumenting");
+ ClassDefinition cld = new ClassDefinition(clz, buffer);
+ inst.redefineClasses(new ClassDefinition[] { cld });
+ }
+ catch (Exception e) { e.printStackTrace(); }
+ }
+ }, 500);
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/lang/instrument/RedefineClassWithNativeMethodApp.java Mon Mar 24 16:11:24 2008 -0700
@@ -0,0 +1,38 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+public class RedefineClassWithNativeMethodApp {
+ public static void main(String[] args) throws Exception {
+ try {
+ // give the agent a chance to redefine the target class
+ Thread.sleep(2000);
+ } catch (InterruptedException ie) {
+ }
+
+ System.out.println("Creating instance of " +
+ RedefineClassWithNativeMethodAgent.clz);
+ RedefineClassWithNativeMethodAgent.clz.newInstance();
+
+ System.exit(0);
+ }
+}