Program: 156159
Project: 156159
Buggy source:
@Override protected Object decode(Channel channel,SocketAddress remoteAddress,Object msg) throws Exception {
  ChannelBuffer buf=(ChannelBuffer)msg;
  String imei=String.format("String_Node_Str",buf.readLong());
  if (!identify(imei,channel)) {
    return null;
  }
  List<Position> positions=new LinkedList<>();
  while (buf.readableBytes() > 1) {
    int dataEnd=buf.readUnsignedShort() + buf.readerIndex();
    int type=buf.readUnsignedByte();
    int confirmKey=buf.readUnsignedByte() & 0x7F;
    while (buf.readerIndex() < dataEnd) {
      Position position=new Position();
      position.setProtocol(getProtocolName());
      position.setDeviceId(getDeviceId());
      int structEnd=buf.readUnsignedByte() + buf.readerIndex();
      long time=buf.readUnsignedInt();
      if ((time & 0x0f) == DATA_TYPE) {
        time=time >> 4 << 1;
        time+=0x47798280;
        position.setTime(new Date(time * 1000));
        int mask;
        List<Integer> masks=new LinkedList<>();
        do {
          mask=buf.readUnsignedShort();
          masks.add(mask);
        }
 while (BitUtil.check(mask,15));
        mask=masks.get(0);
        if (BitUtil.check(mask,0)) {
          position.setValid(true);
          position.setLongitude(buf.readFloat());
          position.setLatitude(buf.readFloat());
          position.setSpeed(buf.readUnsignedByte());
          int gps=buf.readUnsignedByte();
          position.set(Event.KEY_SATELLITES,gps & 0xf);
          position.set(Event.KEY_HDOP,gps >> 4);
          position.setCourse(buf.readUnsignedByte());
          position.setAltitude(buf.readUnsignedShort());
          position.set(Event.KEY_ODOMETER,buf.readUnsignedInt());
        }
        if (BitUtil.check(mask,1)) {
          position.set(Event.KEY_INPUT,buf.readUnsignedShort());
        }
        for (int i=1; i <= 8; i++) {
          if (BitUtil.check(mask,i + 1)) {
            position.set(Event.PREFIX_ADC + i,buf.readUnsignedShort());
          }
        }
        if (BitUtil.check(mask,10))         buf.skipBytes(4);
        if (BitUtil.check(mask,11))         buf.skipBytes(4);
        if (BitUtil.check(mask,12))         buf.skipBytes(2);
        if (BitUtil.check(mask,13))         buf.skipBytes(2);
        if (BitUtil.check(mask,14)) {
          position.set(Event.KEY_MCC,buf.readUnsignedShort());
          position.set(Event.KEY_MNC,buf.readUnsignedByte());
          position.set(Event.KEY_LAC,buf.readUnsignedShort());
          position.set(Event.KEY_CELL,buf.readUnsignedShort());
          position.set(Event.KEY_GSM,buf.readUnsignedByte());
          buf.readUnsignedByte();
        }
        if (BitUtil.check(mask,0)) {
          positions.add(position);
        }
      }
      buf.readerIndex(structEnd);
    }
    if (type == MSG_ASYNC_STACK && channel != null) {
      ChannelBuffer response=ChannelBuffers.buffer(ByteOrder.LITTLE_ENDIAN,8 + 2 + 2+ 1);
      response.writeLong(Long.parseLong(imei));
      response.writeShort(2);
      response.writeByte(MSG_STACK_COFIRM);
      response.writeByte(confirmKey);
      int checksum=0;
      for (int i=0; i < response.writerIndex(); i++) {
        checksum+=response.getUnsignedByte(i);
      }
      response.writeByte(checksum);
      channel.write(response);
    }
  }
  return positions;
}

Fixed version (ground truth):
@Override protected Object decode(Channel channel,SocketAddress remoteAddress,Object msg) throws Exception {
  ChannelBuffer buf=(ChannelBuffer)msg;
  String imei=String.format("String_Node_Str",buf.readLong());
  if (!identify(imei,channel)) {
    return null;
  }
  List<Position> positions=new LinkedList<>();
  while (buf.readableBytes() > 1) {
    int dataEnd=buf.readUnsignedShort() + buf.readerIndex();
    int type=buf.readUnsignedByte();
    int confirmKey=buf.readUnsignedByte() & 0x7F;
    while (buf.readerIndex() < dataEnd) {
      Position position=new Position();
      position.setProtocol(getProtocolName());
      position.setDeviceId(getDeviceId());
      int structEnd=buf.readUnsignedByte() + buf.readerIndex();
      long time=buf.readUnsignedInt();
      if ((time & 0x0f) == DATA_TYPE) {
        time=time >> 4 << 1;
        time+=0x47798280;
        position.setTime(new Date(time * 1000));
        int mask;
        List<Integer> masks=new LinkedList<>();
        do {
          mask=buf.readUnsignedShort();
          masks.add(mask);
        }
 while (BitUtil.check(mask,15));
        mask=masks.get(0);
        if (BitUtil.check(mask,0)) {
          position.setValid(true);
          position.setLongitude(buf.readFloat());
          position.setLatitude(buf.readFloat());
          position.setSpeed(buf.readUnsignedByte());
          int gps=buf.readUnsignedByte();
          position.set(Event.KEY_SATELLITES,gps & 0xf);
          position.set(Event.KEY_HDOP,gps >> 4);
          position.setCourse(buf.readUnsignedByte());
          position.setAltitude(buf.readUnsignedShort());
          position.set(Event.KEY_ODOMETER,buf.readUnsignedInt());
        }
        if (BitUtil.check(mask,1)) {
          position.set(Event.KEY_INPUT,buf.readUnsignedShort());
        }
        for (int i=1; i <= 8; i++) {
          if (BitUtil.check(mask,i + 1)) {
            position.set(Event.PREFIX_ADC + i,buf.readUnsignedShort());
          }
        }
        if (BitUtil.check(mask,10)) {
          buf.skipBytes(4);
        }
        if (BitUtil.check(mask,11)) {
          buf.skipBytes(4);
        }
        if (BitUtil.check(mask,12)) {
          buf.skipBytes(2);
        }
        if (BitUtil.check(mask,13)) {
          buf.skipBytes(2);
        }
        if (BitUtil.check(mask,14)) {
          position.set(Event.KEY_MCC,buf.readUnsignedShort());
          position.set(Event.KEY_MNC,buf.readUnsignedByte());
          position.set(Event.KEY_LAC,buf.readUnsignedShort());
          position.set(Event.KEY_CELL,buf.readUnsignedShort());
          position.set(Event.KEY_GSM,buf.readUnsignedByte());
          buf.readUnsignedByte();
        }
        if (BitUtil.check(mask,0)) {
          positions.add(position);
        }
      }
      buf.readerIndex(structEnd);
    }
    if (type == MSG_ASYNC_STACK && channel != null) {
      ChannelBuffer response=ChannelBuffers.buffer(ByteOrder.LITTLE_ENDIAN,8 + 2 + 2+ 1);
      response.writeLong(Long.parseLong(imei));
      response.writeShort(2);
      response.writeByte(MSG_STACK_COFIRM);
      response.writeByte(confirmKey);
      int checksum=0;
      for (int i=0; i < response.writerIndex(); i++) {
        checksum+=response.getUnsignedByte(i);
      }
      response.writeByte(checksum);
      channel.write(response);
    }
  }
  return positions;
}