Program: 31602
Project: 31602
Buggy source:
private int parseDecimal(int bufferIndex,Context context){
  double d=0.0;
  long part=0;
  boolean neg=(byteBuffer[bufferIndex] == '-');
  if (neg) {
    ++bufferIndex;
  }
  int limit=bufferLimit;
  long shift=0;
  outer1:   while (true) {
    try {
      for (final byte[] buffer=byteBuffer; bufferIndex < limit; bufferIndex++) {
        final int b=buffer[bufferIndex];
        if (b >= '0' && b <= '9') {
          shift*=10;
          part=part * 10 + (b - '0');
        }
 else         if (b == '.') {
          shift=1;
        }
 else {
          break outer1;
        }
      }
    }
  finally {
      if (bufferIndex == limit) {
        if ((bufferIndex=fillBuffer()) == -1) {
          throw new RuntimeException("String_Node_Str");
        }
        limit=bufferLimit;
      }
    }
  }
  if (neg) {
    part*=-1;
  }
  d=shift != 0 ? (double)part / (double)shift : part;
  if (byteBuffer[bufferIndex] == 'e' || byteBuffer[bufferIndex] == 'E') {
    ++bufferIndex;
    part=0;
    neg=byteBuffer[bufferIndex] == '-';
    bufferIndex=neg ? ++bufferIndex : bufferIndex;
    outer1:     while (true) {
      for (final byte[] buffer=byteBuffer; bufferIndex < limit; bufferIndex++) {
        final int b=buffer[bufferIndex];
        if (b >= '0' && b <= '9') {
          part=part * 10 + (b - '0');
          continue;
        }
        break outer1;
      }
    }
    d=(neg) ? d / (double)Math.pow(10,part) : d * (double)Math.pow(10,part);
  }
  context.doubleHolder=d;
  return bufferIndex;
}

Fixed version (ground truth):
private int parseDecimal(int bufferIndex,Context context){
  double d=0.0;
  long part=0;
  boolean neg=(byteBuffer[bufferIndex] == '-');
  if (neg) {
    ++bufferIndex;
  }
  long shift=0;
  outer1:   while (true) {
    final int limit=bufferLimit;
    try {
      for (final byte[] buffer=byteBuffer; bufferIndex < limit; bufferIndex++) {
        final int b=buffer[bufferIndex];
        if (b >= '0' && b <= '9') {
          shift*=10;
          part=part * 10 + (b - '0');
        }
 else         if (b == '.') {
          shift=1;
        }
 else {
          break outer1;
        }
      }
    }
  finally {
      if (bufferIndex == limit && ((bufferIndex=fillBuffer()) == -1)) {
        throw new RuntimeException("String_Node_Str");
      }
    }
  }
  if (neg) {
    part*=-1;
  }
  d=shift != 0 ? (double)part / (double)shift : part;
  if (byteBuffer[bufferIndex] == 'e' || byteBuffer[bufferIndex] == 'E') {
    ++bufferIndex;
    part=0;
    neg=byteBuffer[bufferIndex] == '-';
    bufferIndex=neg ? ++bufferIndex : bufferIndex;
    outer1:     while (true) {
      final int limit=bufferLimit;
      for (final byte[] buffer=byteBuffer; bufferIndex < limit; bufferIndex++) {
        final int b=buffer[bufferIndex];
        if (b >= '0' && b <= '9') {
          part=part * 10 + (b - '0');
          continue;
        }
        break outer1;
      }
      if (bufferIndex == limit && ((bufferIndex=fillBuffer()) == -1)) {
        throw new RuntimeException("String_Node_Str");
      }
    }
    d=(neg) ? d / (double)Math.pow(10,part) : d * (double)Math.pow(10,part);
  }
  context.doubleHolder=d;
  return bufferIndex;
}