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

[PATCH] Fix for Invalid Local References

From: Byeongcheol Lee <lineonking_at_gmail.com>
Date: Fri, 21 May 2010 13:59:03 -0500

Dear Subversion Developers:

I attach a patch for the invalid local references in the
"CopySources.cpp", and the log message is here:

[[[
* subversion/bindings/javahl/native/CopySources.cpp
(array): Replace "JNIStringHolder" with two calls to
"GetStringUTFChars" and "DeleteLocalRef".
]]]

To produce this bug, run your JavaHL regression test under our dynamic
bug detector, Jinn [http://userweb.cs.utexas.edu/~bclee/jinn]:

$env JAVA_TOOL_OPTIONS=-agentlib:jinn make check-javahl
...
................Exception in thread "main"
xtc.lang.blink.agent.JNIAssertionFailure: The JNI reference 0x6857e68c
is dead in the argument 2 of ReleaseStringUTFChars.
        at xtc.lang.blink.agent.JNIAssertionFailure.assertFail(JNIAssertionFailure.java:16)
        at org.apache.subversion.javahl.SVNClient.copy(Native Method)
        at org.apache.subversion.javahl.BasicTests.testCopy(BasicTests.java:913)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:597)
        at junit.framework.TestCase.runTest(TestCase.java:164)
        at junit.framework.TestCase.runBare(TestCase.java:130)
        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)
...

The relevant source lines are here.

$ cat -n subversion/bindings/javahl/native/CopySources.cpp
...
    85 apr_array_header_t *
    86 CopySources::array(SVN::Pool &pool)
    87 {
...
    99 for (std::vector<jobject>::const_iterator it = sources.begin();
   100 it < sources.end(); ++it)
   101 {
...
   119 JNIStringHolder path(jpath);
...
   126 env->DeleteLocalRef(jpath);
...
   170 }
...
   175 }

The "array" method allocates, and frees and uses a local reference at
Line 119, 126, and 99. The use at Line 99 is implicit. because C++
destructor of "JNIStringHolder" runs before the second iteration of
the for loop from Line 99 to 170. The source lines and calling context
at the pointer of failure are here.

$cat -n ./subversion/bindings/javahl/native/JNIStringHolder.cpp
...
    46 JNIStringHolder::~JNIStringHolder()
    47 {
    48 if (m_jtext && m_str)
    49 m_env->ReleaseStringUTFChars(m_jtext, m_str);
    50 }

~JNIStringHolder at subversion/bindings/javahl/native/JNIStringHolder.cpp:49
CopySources::array at subversion/bindings/javahl/native/CopySources.cpp:99
SVNClient::copyat subversion/bindings/javahl/native/SVNClient.cpp:438
Java_org_apache_subversion_javahl_SVNClient_copyat
subversion/bindings/javahl/native/org_apache_subversion_javahl_SVNClient.cpp:588

I looked at the definition and uses of "JNIStringHolder", and It's
better not to use the "JNIStringHolder" within a loop. My patch
replaces "JNIStringHolder" with a few calls to JNI functions.

Regards,
Byeong

Received on 2010-05-21 20:59:32 CEST

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