Author: amiloslavskiy
Date: Tue Sep 29 12:12:59 2020
New Revision: 1882115

URL: http://svn.apache.org/viewvc?rev=1882115&view=rev
Log:
JavaHL: Fix incorrect cache in SVNBase::createCppBoundObject

The problem here is that 'SVNBase::createCppBoundObject' can work
with different classes (see argument), but it cached methodID of
'<init>' for the first class processed. When invoked with a
different class later, it will call wring '<init>' method.

The error is seen when running JavaHL tests with JDK14.

Error message is:
FATAL ERROR in native method: Wrong object class or methodID passed to JNI call
  at <...>.javahl.util.SubstLib.translateOutputStream(Native Method)
  at <...>.javahl.SVNUtil.translateStream(SVNUtil.java:1046)
  at <...>.javahl.UtilTests.testTranslateStream(UtilTests.java:521)
  <...>

[in subversion/bindings/javahl]
* native/SVNBase.cpp
  (createCppBoundObject): Do not cache methodID.

Modified:
    subversion/trunk/subversion/bindings/javahl/native/SVNBase.cpp

Modified: subversion/trunk/subversion/bindings/javahl/native/SVNBase.cpp
URL: 
http://svn.apache.org/viewvc/subversion/trunk/subversion/bindings/javahl/native/SVNBase.cpp?rev=1882115&r1=1882114&r2=1882115&view=diff
==============================================================================
--- subversion/trunk/subversion/bindings/javahl/native/SVNBase.cpp (original)
+++ subversion/trunk/subversion/bindings/javahl/native/SVNBase.cpp Tue Sep 29 
12:12:59 2020
@@ -107,13 +107,9 @@ jobject SVNBase::createCppBoundObject(co
   if (JNIUtil::isJavaExceptionThrown())
     return NULL;
 
-  static jmethodID ctor = 0;
-  if (ctor == 0)
-    {
-      ctor = env->GetMethodID(clazz, "<init>", "(J)V");
-      if (JNIUtil::isJavaExceptionThrown())
-        return NULL;
-    }
+  jmethodID ctor = env->GetMethodID(clazz, "<init>", "(J)V");
+  if (JNIUtil::isJavaExceptionThrown())
+    return NULL;
 
   jlong cppAddr = this->getCppAddr();
 


Reply via email to