mirror of
https://github.com/openjdk/jdk.git
synced 2025-09-21 03:24:38 +02:00
6545149: 4/4 JLI Instrumentation.redefineClasses SIGSEGVs on java/lang/Thread
Add regression test for redefining class with native methods. Reviewed-by: sspitsyn
This commit is contained in:
parent
904063c9c9
commit
11ff50b340
3 changed files with 189 additions and 0 deletions
|
@ -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
|
|
@ -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);
|
||||||
|
}
|
||||||
|
}
|
|
@ -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);
|
||||||
|
}
|
||||||
|
}
|
Loading…
Add table
Add a link
Reference in a new issue