Program: 156227
Project: 156227
Buggy source:
/** 
 * Decode message
 */
@Override protected Object decode(ChannelHandlerContext ctx,Channel channel,Object msg) throws Exception {
  ChannelBuffer buf=(ChannelBuffer)msg;
  int type=buf.readUnsignedShort();
  buf.readUnsignedShort();
  if (type == MSG_IDENT || type == MSG_IDENT_FULL) {
    long id=buf.readUnsignedInt();
    int length=buf.readUnsignedShort();
    buf.skipBytes(length);
    length=buf.readUnsignedShort();
    buf.skipBytes(length);
    length=buf.readUnsignedShort();
    String imei=buf.readBytes(length).toString(Charset.defaultCharset());
    try {
      deviceId=getDataManager().getDeviceByImei(imei).getId();
      loadLastIndex();
    }
 catch (    Exception error) {
      Log.warning("String_Node_Str" + imei + "String_Node_Str"+ id+ "String_Node_Str");
    }
  }
 else   if (deviceId != 0 && (type == MSG_POINT || type == MSG_ALARM || type == MSG_LOGMSG)) {
    List<Position> positions=new LinkedList<Position>();
    int recordCount=1;
    if (type == MSG_LOGMSG) {
      recordCount=buf.readUnsignedShort();
    }
    for (int j=0; j < recordCount; j++) {
      Position position=new Position();
      StringBuilder extendedInfo=new StringBuilder("String_Node_Str");
      position.setDeviceId(deviceId);
      if (type == MSG_LOGMSG) {
        extendedInfo.append("String_Node_Str");
        int subtype=buf.readUnsignedShort();
        if (subtype == MSG_ALARM) {
          extendedInfo.append("String_Node_Str");
        }
        if (buf.readUnsignedShort() > buf.readableBytes()) {
          break;
        }
        lastIndex=buf.readUnsignedInt();
        position.setId(lastIndex);
      }
 else {
        newIndex=buf.readUnsignedInt();
      }
      Calendar time=Calendar.getInstance(TimeZone.getTimeZone("String_Node_Str"));
      time.clear();
      time.setTimeInMillis(buf.readUnsignedInt() * 1000);
      position.setTime(time.getTime());
      position.setLatitude(((double)buf.readInt()) / 0x7FFFFFFF * 180.0);
      position.setLongitude(((double)buf.readInt()) / 0x7FFFFFFF * 180.0);
      position.setSpeed(((double)buf.readUnsignedInt()) / 100);
      position.setCourse(((double)buf.readUnsignedShort()) / 100);
      position.setAltitude(((double)buf.readUnsignedShort()) / 100);
      int satellitesNumber=buf.readUnsignedByte();
      extendedInfo.append("String_Node_Str");
      extendedInfo.append(satellitesNumber);
      extendedInfo.append("String_Node_Str");
      position.setValid(satellitesNumber >= 3);
      extendedInfo.append("String_Node_Str");
      extendedInfo.append(buf.readUnsignedByte());
      extendedInfo.append("String_Node_Str");
      extendedInfo.append("String_Node_Str");
      extendedInfo.append(buf.readUnsignedInt());
      extendedInfo.append("String_Node_Str");
      long extraFlags=buf.readLong();
      if ((extraFlags & 0x1) == 0x1) {
        int count=buf.readUnsignedShort();
        for (int i=1; i <= count; i++) {
          extendedInfo.append("String_Node_Str").append(i).append("String_Node_Str");
          extendedInfo.append(buf.readUnsignedShort());
          extendedInfo.append("String_Node_Str").append(i).append("String_Node_Str");
        }
      }
      if ((extraFlags & 0x2) == 0x2) {
        int size=buf.readUnsignedShort();
        extendedInfo.append("String_Node_Str");
        extendedInfo.append(buf.toString(buf.readerIndex(),size,Charset.defaultCharset()));
        extendedInfo.append("String_Node_Str");
        buf.skipBytes(size);
      }
      if ((extraFlags & 0x4) == 0x4) {
        int size=buf.readUnsignedShort();
        StringBuilder hex=new StringBuilder();
        for (int i=buf.readerIndex(); i < buf.readerIndex() + size; i++) {
          byte b=buf.getByte(i);
          hex.append(HEX_CHARS.charAt((b & 0xf0) >> 4));
          hex.append(HEX_CHARS.charAt((b & 0x0F)));
        }
        extendedInfo.append("String_Node_Str");
        extendedInfo.append(hex);
        extendedInfo.append("String_Node_Str");
        buf.skipBytes(size);
      }
      if (type == MSG_ALARM) {
        byte[] response={(byte)0xC9,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
        channel.write(ChannelBuffers.wrappedBuffer(response));
        extendedInfo.append("String_Node_Str");
      }
      buf.readUnsignedInt();
      position.setExtendedInfo(extendedInfo.toString());
      positions.add(position);
    }
    requestArchive(channel);
    return positions;
  }
  return null;
}

Fixed version (ground truth):
/** 
 * Decode message
 */
@Override protected Object decode(ChannelHandlerContext ctx,Channel channel,Object msg) throws Exception {
  ChannelBuffer buf=(ChannelBuffer)msg;
  int type=buf.readUnsignedShort();
  buf.readUnsignedShort();
  if (type == MSG_IDENT || type == MSG_IDENT_FULL) {
    long id=buf.readUnsignedInt();
    int length=buf.readUnsignedShort();
    buf.skipBytes(length);
    length=buf.readUnsignedShort();
    buf.skipBytes(length);
    length=buf.readUnsignedShort();
    String imei=buf.readBytes(length).toString(Charset.defaultCharset());
    try {
      deviceId=getDataManager().getDeviceByImei(imei).getId();
      loadLastIndex();
    }
 catch (    Exception error) {
      Log.warning("String_Node_Str" + imei + "String_Node_Str"+ id+ "String_Node_Str");
    }
  }
 else   if (deviceId != 0 && (type == MSG_POINT || type == MSG_ALARM || type == MSG_LOGMSG)) {
    List<Position> positions=new LinkedList<Position>();
    int recordCount=1;
    if (type == MSG_LOGMSG) {
      recordCount=buf.readUnsignedShort();
    }
    for (int j=0; j < recordCount; j++) {
      Position position=new Position();
      StringBuilder extendedInfo=new StringBuilder("String_Node_Str");
      position.setDeviceId(deviceId);
      if (type == MSG_LOGMSG) {
        extendedInfo.append("String_Node_Str");
        int subtype=buf.readUnsignedShort();
        if (subtype == MSG_ALARM) {
          extendedInfo.append("String_Node_Str");
        }
        if (buf.readUnsignedShort() > buf.readableBytes()) {
          lastIndex+=1;
          break;
        }
        lastIndex=buf.readUnsignedInt();
        position.setId(lastIndex);
      }
 else {
        newIndex=buf.readUnsignedInt();
      }
      Calendar time=Calendar.getInstance(TimeZone.getTimeZone("String_Node_Str"));
      time.clear();
      time.setTimeInMillis(buf.readUnsignedInt() * 1000);
      position.setTime(time.getTime());
      position.setLatitude(((double)buf.readInt()) / 0x7FFFFFFF * 180.0);
      position.setLongitude(((double)buf.readInt()) / 0x7FFFFFFF * 180.0);
      position.setSpeed(((double)buf.readUnsignedInt()) / 100);
      position.setCourse(((double)buf.readUnsignedShort()) / 100);
      position.setAltitude(((double)buf.readUnsignedShort()) / 100);
      int satellitesNumber=buf.readUnsignedByte();
      extendedInfo.append("String_Node_Str");
      extendedInfo.append(satellitesNumber);
      extendedInfo.append("String_Node_Str");
      position.setValid(satellitesNumber >= 3);
      extendedInfo.append("String_Node_Str");
      extendedInfo.append(buf.readUnsignedByte());
      extendedInfo.append("String_Node_Str");
      extendedInfo.append("String_Node_Str");
      extendedInfo.append(buf.readUnsignedInt());
      extendedInfo.append("String_Node_Str");
      long extraFlags=buf.readLong();
      if ((extraFlags & 0x1) == 0x1) {
        int count=buf.readUnsignedShort();
        for (int i=1; i <= count; i++) {
          extendedInfo.append("String_Node_Str").append(i).append("String_Node_Str");
          extendedInfo.append(buf.readUnsignedShort());
          extendedInfo.append("String_Node_Str").append(i).append("String_Node_Str");
        }
      }
      if ((extraFlags & 0x2) == 0x2) {
        int size=buf.readUnsignedShort();
        extendedInfo.append("String_Node_Str");
        extendedInfo.append(buf.toString(buf.readerIndex(),size,Charset.defaultCharset()));
        extendedInfo.append("String_Node_Str");
        buf.skipBytes(size);
      }
      if ((extraFlags & 0x4) == 0x4) {
        int size=buf.readUnsignedShort();
        StringBuilder hex=new StringBuilder();
        for (int i=buf.readerIndex(); i < buf.readerIndex() + size; i++) {
          byte b=buf.getByte(i);
          hex.append(HEX_CHARS.charAt((b & 0xf0) >> 4));
          hex.append(HEX_CHARS.charAt((b & 0x0F)));
        }
        extendedInfo.append("String_Node_Str");
        extendedInfo.append(hex);
        extendedInfo.append("String_Node_Str");
        buf.skipBytes(size);
      }
      if (type == MSG_ALARM) {
        byte[] response={(byte)0xC9,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
        channel.write(ChannelBuffers.wrappedBuffer(response));
        extendedInfo.append("String_Node_Str");
      }
      buf.readUnsignedInt();
      position.setExtendedInfo(extendedInfo.toString());
      positions.add(position);
    }
    requestArchive(channel);
    return positions;
  }
  return null;
}