Committed in r949842.  Sorry for the delay.

Cheers,
-Hyrum

On Fri, May 21, 2010 at 1:59 PM, Byeongcheol Lee <lineonk...@gmail.com>wrote:

> 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<http://userweb.cs.utexas.edu/%7Ebclee/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
>

Reply via email to