Uploaded image for project: 'Axiom'
  1. Axiom
  2. AXIOM-438

StringIndexOutOfBoundsException occur on rare occasions is when you create a stub object

    XMLWordPrintableJSON

Details

    • Bug
    • Status: Closed
    • Trivial
    • Resolution: Won't Fix
    • 1.2.10
    • None
    • API
    • None
    • Linux

    Description

      (Google Translated)
      There is a problem with the logic of UUIDGenerator.getInitialUUID, is rare, can occur when generating the object of the stub is StringIndexOutOfBoundsException.
      The cause is because the next "1" s number, places such as "01" when over a string of numeric Integer.toHexString will decrease.
      What are you handling this like why, I do not understand, what the problem be solved by simply zero-fill?
      We appreciate if you fix this bug.

      【The appropriate program】

      public class UUIDGenerator {
      /* Omitted */
      protected static String getInitialUUID() {
      if (myRand == null)

      { myRand = new Random(); }
      long rand = myRand.nextLong();
      String sid;
      try { sid = InetAddress.getLocalHost().toString(); } catch (UnknownHostException e) { sid = Thread.currentThread().getName(); }
      StringBuffer sb = new StringBuffer();
      sb.append(sid);
      sb.append(":");
      sb.append(Long.toString(rand));
      MessageDigest md5 = null;
      try { md5 = MessageDigest.getInstance("MD5"); } catch (NoSuchAlgorithmException e) { throw new OMException(e); }
      md5.update(sb.toString().getBytes());
      byte[] array = md5.digest();
      StringBuffer sb2 = new StringBuffer();
      for (int j = 0; j < array.length; ++j) { int b = array[j] & 0xFF; sb2.append(Integer.toHexString(b)); // The problem here! Is a string of "1" the number "01" is Integer.toHexString, reduce the number of digits is }
      int begin = myRand.nextInt();
      if (begin < 0) begin = begin * -1;
      begin = begin % 8;
      return sb2.toString().substring(begin, begin + 18).toUpperCase(); // Is raised here StringIndexOutofBoundsException
      }

      /* Omitted */
      }

      【Error Trace】

      java.lang.StringIndexOutOfBoundsException: String index out of range: 25
      at java.lang.String.substring(Unknown Source)
      at org.apache.axiom.om.util.UUIDGenerator.getInitialUUID(UUIDGenerator.java:94)
      at org.apache.axiom.om.util.UUIDGenerator.getUUID(UUIDGenerator.java:54)
      at org.apache.axis2.description.AxisOperation.<init>(AxisOperation.java:90)
      at org.apache.axis2.description.AxisOperation.<init>(AxisOperation.java:95)
      at org.apache.axis2.description.TwoChannelAxisOperation.<init>(TwoChannelAxisOperation.java:52)
      at org.apache.axis2.description.OutInAxisOperation.<init>(OutInAxisOperation.java:65)
      at org.apache.axis2.description.RobustOutOnlyAxisOperation.<init>(RobustOutOnlyAxisOperation.java:47)
      at org.apache.axis2.client.Stub.addAnonymousOperations(Stub.java:233)



      (原文)

      UUIDGenerator.getInitialUUIDのロジックに問題があり、ごく稀にですが、スタブのオブジェクト生成時にStringIndexOutOfBoundsExceptionが発生します。
      原因はInteger.toHexStringで数値を文字列化する際に"01"のような数値だと"1"となり、桁数が減ってしまうためです。
      なぜこのような処理をしているのか、理解できていないのですが、単純に0埋めすれば解決する問題でしょうか?
      このバグを修正していただけると幸いです。


      【該当プログラム】

      public class UUIDGenerator {
      /* 省略 */
      protected static String getInitialUUID() {
      if (myRand == null) { myRand = new Random(); }

      long rand = myRand.nextLong();
      String sid;
      try

      { sid = InetAddress.getLocalHost().toString(); }

      catch (UnknownHostException e)

      { sid = Thread.currentThread().getName(); }

      StringBuffer sb = new StringBuffer();
      sb.append(sid);
      sb.append(":");
      sb.append(Long.toString(rand));
      MessageDigest md5 = null;
      try

      { md5 = MessageDigest.getInstance("MD5"); }

      catch (NoSuchAlgorithmException e)

      { throw new OMException(e); }

      md5.update(sb.toString().getBytes());
      byte[] array = md5.digest();
      StringBuffer sb2 = new StringBuffer();
      for (int j = 0; j < array.length; ++j)

      { int b = array[j] & 0xFF; sb2.append(Integer.toHexString(b)); // ここが問題!Integer.toHexStringで"01"の数値が"1"の文字列になり、桁数が減る }

      int begin = myRand.nextInt();
      if (begin < 0) begin = begin * -1;
      begin = begin % 8;
      return sb2.toString().substring(begin, begin + 18).toUpperCase(); // ここでStringIndexOutofBoundsExceptionが発生
      }

      /* 省略 */
      }

      【トレース内容】

      java.lang.StringIndexOutOfBoundsException: String index out of range: 25
      at java.lang.String.substring(Unknown Source)
      at org.apache.axiom.om.util.UUIDGenerator.getInitialUUID(UUIDGenerator.java:94)
      at org.apache.axiom.om.util.UUIDGenerator.getUUID(UUIDGenerator.java:54)
      at org.apache.axis2.description.AxisOperation.<init>(AxisOperation.java:90)
      at org.apache.axis2.description.AxisOperation.<init>(AxisOperation.java:95)
      at org.apache.axis2.description.TwoChannelAxisOperation.<init>(TwoChannelAxisOperation.java:52)
      at org.apache.axis2.description.OutInAxisOperation.<init>(OutInAxisOperation.java:65)
      at org.apache.axis2.description.RobustOutOnlyAxisOperation.<init>(RobustOutOnlyAxisOperation.java:47)
      at org.apache.axis2.client.Stub.addAnonymousOperations(Stub.java:233)

      Attachments

        Activity

          People

            Unassigned Unassigned
            chakimar Masaki Nishikawa
            Votes:
            0 Vote for this issue
            Watchers:
            2 Start watching this issue

            Dates

              Created:
              Updated:
              Resolved: