Uploaded image for project: 'Harmony'
  1. Harmony
  2. HARMONY-1295

[classlib][net] flaw in setReuseAddrAndReusePort()

    XMLWordPrintableJSON

Details

    • Bug
    • Status: Closed
    • Critical
    • Resolution: Fixed
    • None
    • None
    • Classlib
    • 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

        1. Harmony1295.diff
          0.5 kB
          Jimmy, Jing Lv

        Issue Links

          Activity

            People

              paulex Paulex Yang
              varlax Alexey Varlamov
              Votes:
              0 Vote for this issue
              Watchers:
              0 Start watching this issue

              Dates

                Created:
                Updated:
                Resolved: