Program: 43417
Project: 43417
Buggy source:
/** 
 * Check a parcel containing metadata is well formed. The header is checked as well as the individual records format. However, the data inside the record is not checked because we do lazy access (we check/unmarshall only data the user asks for.) Format of a metadata parcel: <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 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |                     metadata total size                       | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |     'M'       |     'E'       |     'T'       |     'A'       | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |                                                               | |                .... metadata records ....                     | |                                                               | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ </pre>
 * @param parcel With the serialized data. Metadata keeps areference on it to access it later on. The caller should not modify the parcel after this call (and not call recycle on it.)
 * @return false if an error occurred.
 */
public boolean parse(Parcel parcel){
  if (parcel.dataAvail() < kMetaHeaderSize) {
    Log.e(TAG,"String_Node_Str" + parcel.dataAvail());
    return false;
  }
  final int pin=parcel.dataPosition();
  final int size=parcel.readInt();
  if (parcel.dataAvail() < size || size < kMetaHeaderSize) {
    Log.e(TAG,"String_Node_Str" + size);
    parcel.setDataPosition(pin);
    return false;
  }
  final int kShouldBeMetaMarker=parcel.readInt();
  if (kShouldBeMetaMarker != kMetaMarker) {
    Log.e(TAG,"String_Node_Str" + Integer.toHexString(kShouldBeMetaMarker));
    parcel.setDataPosition(pin);
    return false;
  }
  if (!scanAllRecords(parcel,size - kMetaHeaderSize)) {
    parcel.setDataPosition(pin);
    return false;
  }
  mParcel=parcel;
  return true;
}

Fixed version (ground truth):
/** 
 * Check a parcel containing metadata is well formed. The header is checked as well as the individual records format. However, the data inside the record is not checked because we do lazy access (we check/unmarshall only data the user asks for.) Format of a metadata parcel: <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 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |                     metadata total size                       | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |     'M'       |     'E'       |     'T'       |     'A'       | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |                                                               | |                .... metadata records ....                     | |                                                               | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ </pre>
 * @param parcel With the serialized data. Metadata keeps areference on it to access it later on. The caller should not modify the parcel after this call (and not call recycle on it.)
 * @return false if an error occurred.
 */
public boolean parse(Parcel parcel){
  if (parcel.dataAvail() < kMetaHeaderSize) {
    Log.e(TAG,"String_Node_Str" + parcel.dataAvail());
    return false;
  }
  final int pin=parcel.dataPosition();
  final int size=parcel.readInt();
  if (parcel.dataAvail() + 4 < size || size < kMetaHeaderSize) {
    Log.e(TAG,"String_Node_Str" + size + "String_Node_Str"+ parcel.dataAvail()+ "String_Node_Str"+ pin);
    parcel.setDataPosition(pin);
    return false;
  }
  final int kShouldBeMetaMarker=parcel.readInt();
  if (kShouldBeMetaMarker != kMetaMarker) {
    Log.e(TAG,"String_Node_Str" + Integer.toHexString(kShouldBeMetaMarker));
    parcel.setDataPosition(pin);
    return false;
  }
  if (!scanAllRecords(parcel,size - kMetaHeaderSize)) {
    parcel.setDataPosition(pin);
    return false;
  }
  mParcel=parcel;
  return true;
}