Details
-
Bug
-
Status: Closed
-
Critical
-
Resolution: Fixed
-
None
-
None
-
None
Description
The tests.api.java.net.DatagramSocketTest test crashes on assert in DRLVM : Assertion `IsInstanceOf(env, obj, struct_Class_to_jclass(f->get_class()))' failed.
The reason is that java.net.DatagramSocket.setReuseAddress(boolean) calls to
PlainDatagramSocketImpl.setOption(int optID, Object val) with Boolean value, but underlying native code treats this value as Integer.
Quickfix must be straightforward enough, but I inclined to blame the design of INetworkSystem.[set|get]SocketOption() as the actual root of the evil. The problem is that this API conceals the details of contract for particular options, and a client have to guess which type of value to pass. And the implementation is basically an ugly switch sorting requests out to setBoolSocketOption() or setIntegerSocketOption(), etc. Shouldn'te refactor this?
Native stack is :
vmcore.dll!GetIntField(JNIEnv_External * env=0x103353a8, _jobject * obj=0x0654f184, _jfieldID * fieldID=0x05e4c088) Line 304 + 0x3a C++
hyluni.dll!intValue(const JNINativeInterface_ * * env=0x103353a8, _jobject * anInteger=0x0654f184) Line 598 + 0x1d C
hyluni.dll!setReuseAddrAndReusePort(const JNINativeInterface_ * * env=0x103353a8, hysocket_struct * hysocketP=0x00160ae0, _jobject * optVal=0x0654f184) Line 1140 C
hyluni.dll!Java_org_apache_harmony_luni_platform_OSNetworkSystem_setSocketOptionImpl(const JNINativeInterface_ * * env=, _jobject * thisClz=, _jobject * aFileDescriptor=, int anOption=, _jobject * aValue=) Line 2321 + 0xc C
Java stack is:
Stack Trace (003FB238):
[003FB238] 00000000: org/apache/harmony/luni/platform/OSNetworkSystem.setSocketOptionImpl(Ljava
/io/FileDescriptor;ILjava/lang/Object;)V
[003FB238] 011D0625(m): org/apache/harmony/luni/platform/OSNetworkSystem.setSocketOption(Ljava/io/
FileDescriptor;ILjava/lang/Object;)V
[003FB238] 011CFF4E(m): org/apache/harmony/luni/net/PlainDatagramSocketImpl.setOption(ILjava/lang/
Object;)V
[003FB238] 011E3DB1(m): java/net/DatagramSocket.setReuseAddress(Z)V
[003FB238] 011E3BB0(m): tests/api/java/net/DatagramSocketTest.test_getReuseAddress()V
[003FB238] 100657D0: java/lang/reflect/VMReflection.invokeMethod(Ljava/lang/Object;Ljava/lang/O
bject;[Ljava/lang/Object;)Ljava/lang/Object;
[003FB238] 011C2CA0(m): java/lang/reflect/Method.invoke(Ljava/lang/Object;[Ljava/lang/Object;)Ljav
a/lang/Object;
[003FB238] 011CCB25(m): junit/framework/TestCase.runTest()V
[003FB238] 011CC66E(m): junit/framework/TestCase.runBare()V
[003FB238] 011CC5BA(m): junit/framework/TestResult$1.protect()V
[003FB238] 011CC44F(m): junit/framework/TestResult.runProtected(Ljunit/framework/Test;Ljunit/frame
work/Protectable;)V
[003FB238] 011CAA3C(m): junit/framework/TestResult.run(Ljunit/framework/TestCase;)V
[003FB238] 011CA910(m): junit/framework/TestCase.run(Ljunit/framework/TestResult;)V
[003FB238] 011CA85B(m): junit/framework/TestSuite.runTest(Ljunit/framework/Test;Ljunit/framework/T
estResult;)V
[003FB238] 011CA12E(m): junit/framework/TestSuite.run(Ljunit/framework/TestResult;)V
[003FB238] 011C9B22(m): junit/textui/TestRunner.doRun(Ljunit/framework/Test;Z)Ljunit/framework/Tes
tResult;
[003FB238] 011C4186(m): junit/textui/TestRunner.start([Ljava/lang/String;)Ljunit/framework/TestRes
ult;
[003FB238] 011C365E(m): junit/textui/TestRunner.main([Ljava/lang/String;)V
[003FB238] 100657D0: java/lang/reflect/VMReflection.invokeMethod(Ljava/lang/Object;Ljava/lang/O
bject;[Ljava/lang/Object;)Ljava/lang/Object;
[003FB238] 011C2CA0(m): java/lang/reflect/Method.invoke(Ljava/lang/Object;[Ljava/lang/Object;)Ljav
a/lang/Object;
[003FB238] 011A59DF(m): java/lang/VMStart$MainThread.runImpl()V
[003FB238] 100657D0: null
End Stack Trace (003FB238, depth=22)
Attachments
Attachments
Issue Links
- is related to
-
HARMONY-1375 [classlib][net]Refine native code interface of setSocketOption
- Closed