[svn.haxx.se] · SVN Dev · SVN Users · SVN Org · TSVN Dev · TSVN Users · Subclipse Dev · Subclipse Users · this month's index

[PATCH] Fix for a JNI bug in CreateJ.cpp (JavaHL)

From: Byeongcheol Lee <lineonking_at_gmail.com>
Date: Tue, 18 May 2010 22:14:17 -0500

Dear Subversion Developers:

I attach a patch for a JNI bug. To reproduce the bug, run your JavaHL
regression test under our dynamic JNI bug detector, Jinn

$env JAVA_TOOL_OPTIONS=-agentlib:jinn make check-javahl
.Exception in thread "main" xtc.lang.blink.agent.JNIAssertionFailure:
The return type mismatch in CallObjectMethodV: method 0x9626fe4 has
return type: (Ljava/lang/Object;)Z
        at xtc.lang.blink.agent.JNIAssertionFailure.assertFail(JNIAssertionFailure.java:16)
        at org.apache.subversion.javahl.SVNClient.doImport(Native Method)
        at org.apache.subversion.javahl.SVNTests.setUp(SVNTests.java:239)
        at junit.framework.TestCase.runBare(TestCase.java:128)
        at junit.framework.TestResult$1.protect(TestResult.java:106)
        at junit.framework.TestResult.runProtected(TestResult.java:124)
        at junit.framework.TestResult.run(TestResult.java:109)
        at junit.framework.TestCase.run(TestCase.java:120)
        at junit.framework.TestSuite.runTest(TestSuite.java:230)
        at junit.framework.TestSuite.run(TestSuite.java:225)
        at junit.framework.TestSuite.runTest(TestSuite.java:230)
        at junit.framework.TestSuite.run(TestSuite.java:225)
        at junit.textui.TestRunner.doRun(TestRunner.java:121)
        at junit.textui.TestRunner.doRun(TestRunner.java:114)
        at junit.textui.TestRunner.run(TestRunner.java:77)
        at org.apache.subversion.javahl.RunTests.main(RunTests.java:116)

To understand what caused the JNI error, I attached a gdb to the JVM.
Relevant caling context and source lines are here.

#5 0x8f86cdf5 in CreateJ::Set (objects=...)
    at subversion/bindings/javahl/native/CreateJ.cpp:912
#6 0x8f86bf4f in CommitMessage::getCommitMessage (this=0x81bf6d0,
    at subversion/bindings/javahl/native/CommitMessage.cpp:210
#11 0x8f88bff0 in Java_org_apache_subversion_javahl_SVNClient_doImport (
    env=0x805a518, jthis=0xb7281ce4, jpath=0xb7281ce0, jurl=0xb7281cdc,
    jmessage=0x0, jdepth=0xb7281cd4, jnoIgnore=0 '\000',
    jignoreUnknownNodeTypes=0 '\000', jrevpropTable=0x0)
    at subversion/bindings/javahl/native/org_apache_subversion_javahl_SVNClient.cpp:792

In subversion/bindings/javahl/native/CreateJ.cpp
   883 jclass clazz = env->FindClass("java/util/HashSet");
   895 static jmethodID add_mid = 0;
   898 add_mid = env->GetMethodID(clazz, "add", "(Ljava/lang/Object;)Z");
   912 env->CallObjectMethod(set, add_mid, jthing);

There is a JNI type mismatch between Line 898 and 912.
 The "add_mid" at Line 898 points a Java method returning a boolean
value, but the
 JNI function at Line 912 assumes that "add_mid" is returning a Java reference.
This violates a JNI programming rule:

"You should replace type in Call<type>Method with the Java type of the
method you are calling"

The fix is trivial and obvious, and line 912 must change its JNI
function from "CallObjectMethod"
to "CallBooleanMethod."


Received on 2010-05-19 05:14:51 CEST

This is an archived mail posted to the Subversion Dev mailing list.