Program: 193595
Project: 193595
Buggy source:
/** 
 * Go over all the records, collecting metadata keys and records' type field offset in the Parcel. These are stored in mKeyToPosMap for latter retrieval. Format of a metadata record: <pre> 1                   2                   3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |                     record size                               | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |                     metadata key                              |  // TITLE +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |                     metadata type                             |  // STRING_VAL +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |                                                               | |                .... metadata payload ....                     | |                                                               | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ </pre>
 * @param parcel With the serialized records.
 * @param bytesLeft How many bytes in the parcel should be processed.
 * @return false if an error occurred during parsing.
 */
private boolean scanAllRecords(Parcel parcel,int bytesLeft){
  int recCount=0;
  boolean error=false;
  mKeyToPosMap.clear();
  while (bytesLeft > kRecordHeaderSize) {
    final int start=parcel.dataPosition();
    final int size=parcel.readInt();
    if (size <= kRecordHeaderSize) {
      Log.e(TAG,"String_Node_Str");
      error=true;
      break;
    }
    final int metadataId=parcel.readInt();
    if (!checkMetadataId(metadataId)) {
      error=true;
      break;
    }
    if (mKeyToPosMap.containsKey(metadataId)) {
      Log.e(TAG,"String_Node_Str");
      error=true;
      break;
    }
    mKeyToPosMap.put(metadataId,parcel.dataPosition());
    final int metadataType=parcel.readInt();
    if (metadataType <= 0 || metadataType > LAST_TYPE) {
      Log.e(TAG,"String_Node_Str" + metadataType);
      error=true;
      break;
    }
    parcel.setDataPosition(start + size);
    bytesLeft-=size;
    ++recCount;
  }
  if (0 != bytesLeft || error) {
    Log.e(TAG,"String_Node_Str" + recCount);
    mKeyToPosMap.clear();
    return false;
  }
 else {
    return true;
  }
}

Fixed version (ground truth):
/** 
 * Go over all the records, collecting metadata keys and records' type field offset in the Parcel. These are stored in mKeyToPosMap for latter retrieval. Format of a metadata record: <pre> 1                   2                   3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |                     record size                               | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |                     metadata key                              |  // TITLE +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |                     metadata type                             |  // STRING_VAL +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |                                                               | |                .... metadata payload ....                     | |                                                               | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ </pre>
 * @param parcel With the serialized records.
 * @param bytesLeft How many bytes in the parcel should be processed.
 * @return false if an error occurred during parsing.
 */
private boolean scanAllRecords(Parcel parcel,int bytesLeft){
  int recCount=0;
  boolean error=false;
  mKeyToPosMap.clear();
  while (bytesLeft > kRecordHeaderSize) {
    final int start=parcel.dataPosition();
    final int size=parcel.readInt();
    if (size <= kRecordHeaderSize) {
      Log.e(TAG,"String_Node_Str");
      error=true;
      break;
    }
    final int metadataId=parcel.readInt();
    if (!checkMetadataId(metadataId)) {
      error=true;
      break;
    }
    if (mKeyToPosMap.containsKey(metadataId)) {
      Log.e(TAG,"String_Node_Str");
      error=true;
      break;
    }
    mKeyToPosMap.put(metadataId,parcel.dataPosition());
    final int metadataType=parcel.readInt();
    if (metadataType <= 0 || metadataType > LAST_TYPE) {
      Log.e(TAG,"String_Node_Str" + metadataType);
      error=true;
      break;
    }
    try {
      parcel.setDataPosition(MathUtils.addOrThrow(start,size));
    }
 catch (    IllegalArgumentException e) {
      Log.e(TAG,"String_Node_Str" + e.getMessage());
      error=true;
      break;
    }
    bytesLeft-=size;
    ++recCount;
  }
  if (0 != bytesLeft || error) {
    Log.e(TAG,"String_Node_Str" + recCount);
    mKeyToPosMap.clear();
    return false;
  }
 else {
    return true;
  }
}