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
jdk/test/java/lang/instrument
@ -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…
x
Reference in New Issue
Block a user