{"record":{"id":"2ad9b3fd4f969631","repo":"microg/GmsCore","slug":"expected-size-expectedsize-got-i","errorCode":null,"errorMessage":"Expected size \" + expectedSize + \" got \" + i + \" (0x\" + Integer.toHexString(i) + \")","messagePattern":"Expected size \" \\+ expectedSize \\+ \" got \" \\+ i \\+ \" \\(0x\" \\+ Integer\\.toHexString\\(i\\) \\+ \"\\)","errorType":"exception","errorClass":"ReadException","httpStatus":null,"severity":"error","filePath":"play-services-basement/src/main/java/com/google/android/gms/common/internal/safeparcel/SafeParcelReader.java","lineNumber":49,"sourceCode":"    @Deprecated\n    public static int readSingleInt(Parcel parcel) {\n        return parcel.readInt();\n    }\n\n    public static int readHeader(Parcel parcel) {\n        return parcel.readInt();\n    }\n\n    private static int readSize(Parcel parcel, int header) {\n        if ((header & 0xFFFF0000) != 0xFFFF0000)\n            return header >> 16 & 0xFFFF;\n        return parcel.readInt();\n    }\n\n    private static void readExpectedSize(Parcel parcel, int header, int expectedSize) {\n        int i = readSize(parcel, header);\n        if (i != expectedSize)\n            throw new ReadException(\"Expected size \" + expectedSize + \" got \" + i + \" (0x\" + Integer.toHexString(i) + \")\", parcel);\n    }\n\n    @Deprecated\n    public static int readStart(Parcel parcel) {\n        return readObjectHeader(parcel);\n    }\n\n    public static int readObjectHeader(Parcel parcel) {\n        int header = readHeader(parcel);\n        int size = readSize(parcel, header);\n        int start = parcel.dataPosition();\n        if (getFieldId(header) != SafeParcelable.SAFE_PARCEL_OBJECT_MAGIC)\n            throw new ReadException(\"Expected object header. Got 0x\" + Integer.toHexString(header), parcel);\n        int end = start + size;\n        if ((end < start) || (end > parcel.dataSize()))\n            throw new ReadException(\"Size read is invalid start=\" + start + \" end=\" + end, parcel);\n        return end;\n    }","sourceCodeStart":31,"sourceCodeEnd":67,"githubUrl":"https://github.com/microg/GmsCore/blob/157c9d86ac46c195a86c2f15ab55c84036223f95/play-services-basement/src/main/java/com/google/android/gms/common/internal/safeparcel/SafeParcelReader.java#L31-L67","documentation":"SafeParcelReader.readExpectedSize() compares the size field read from the Parcel header with the size the field type requires (int=4, long=8, etc.) and throws a SafeParcelReader.ReadException on mismatch. It guards against corrupted or malformed Parcel data, or Parcels written with a different field layout.","triggerScenarios":"Unmarshalling a Parcel where a primitive field was written with a size differing from expected (e.g. an int stored as 2 bytes, or field order/types changed between writer and reader versions).","commonSituations":"Reading Parcels created by a different app/library version with changed field definitions; corrupted Bundle data; microG vs Google writer mismatches.","solutions":["Ensure writer and reader use the same SafeParcelable field definitions and version","Check Parcel data integrity / re-send the Bundle","Update the library so both sides agree on the parcel format","Catch ReadException and treat the Parcel as invalid"],"exampleFix":"// before\nMyObject o = MyObject.CREATOR.createFromParcel(parcel); // mismatched layout\n// after\ntry {\n    MyObject o = MyObject.CREATOR.createFromParcel(parcel);\n} catch (SafeParcelReader.ReadException e) {\n    Log.w(TAG, \"malformed parcel\", e); // treat as invalid data\n}","handlingStrategy":"try-catch","validationCode":"// verify writer and reader share the same SafeParcelable class version before unmarshalling","typeGuard":null,"tryCatchPattern":"try { obj = CREATOR.createFromParcel(parcel); } catch (SafeParcelReader.ReadException e) { treatAsInvalidParcel(e); }","preventionTips":["Keep parcel field layouts stable across versions","Bump version fields when layouts change","Never hand-write conflicting parcel writes"],"tags":["parcel","deserialization","safeparcel"],"backgroundTag":"protobuf-unmarshal-failed","analyzedSha":"157c9d86ac46c195a86c2f15ab55c84036223f95","analyzedAt":"2026-09-06T17:27:33.892Z","contentChangedAt":"2026-09-06T17:27:33.892Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}