{"record":{"id":"a15bc2f451373fe7","repo":"EllanJiang/GameFramework","slug":"packet-header-is-invalid-networkmanager-receivestate","errorCode":null,"errorMessage":"Packet header is invalid.","messagePattern":"Packet header is invalid\\.","errorType":"exception","errorClass":"GameFrameworkException","httpStatus":null,"severity":"error","filePath":"GameFramework/Network/NetworkManager.ReceiveState.cs","lineNumber":54,"sourceCode":"\n            public IPacketHeader PacketHeader\n            {\n                get\n                {\n                    return m_PacketHeader;\n                }\n            }\n\n            public void PrepareForPacketHeader(int packetHeaderLength)\n            {\n                Reset(packetHeaderLength, null);\n            }\n\n            public void PrepareForPacket(IPacketHeader packetHeader)\n            {\n                if (packetHeader == null)\n                {\n                    throw new GameFrameworkException(\"Packet header is invalid.\");\n                }\n\n                Reset(packetHeader.PacketLength, packetHeader);\n            }\n\n            public void Dispose()\n            {\n                Dispose(true);\n                GC.SuppressFinalize(this);\n            }\n\n            private void Dispose(bool disposing)\n            {\n                if (m_Disposed)\n                {\n                    return;\n                }\n","sourceCodeStart":36,"sourceCodeEnd":72,"githubUrl":"https://github.com/EllanJiang/GameFramework/blob/d0c010b05167c58e92350449d04864a91ca13fd2/GameFramework/Network/NetworkManager.ReceiveState.cs#L36-L72","documentation":"ReceiveState.PrepareForPacket prepares the receive buffer for an incoming packet body, but the IPacketHeader passed in is null, so it throws GameFrameworkException. Normally called by ProcessPacketHeader after a header was successfully deserialized; a null header reaching this point indicates the helper produced a null header despite reporting success.","triggerScenarios":"A custom INetworkChannelHelper.DeserializePacketHeader returning null without failing; header handler bugs that return null on some packet types; custom code calling PrepareForPacket directly with a null header.","commonSituations":"Hand-written packet header deserializers that forget to return the parsed object on some code path; protocol upgrades where new header versions fall through to a null return.","solutions":["Ensure DeserializePacketHeader in your INetworkChannelHelper always returns a valid IPacketHeader or signals failure (so ProcessPacketHeader throws earlier with a clearer error).","Null-check the header returned by your helper before proceeding.","Review any custom ReceiveState usage that calls PrepareForPacket with externally sourced headers."],"exampleFix":"// before\nreturn Deserialize(bytes); // may return null\n// after\nvar header = Deserialize(bytes);\nif (header == null) { return null; } // fail the header step in ProcessPacketHeader\nreturn header;","handlingStrategy":"validation","validationCode":"public static bool IsValidHeader(IPacketHeader h) => h != null && h.PacketLength >= 0;","typeGuard":"public static bool TryGetHeader(byte[] bytes, out IPacketHeader header) { header = helper.DeserializePacketHeader(bytes); return header != null; }","tryCatchPattern":"try { ReceiveStatePrepare(header); } catch (GameFrameworkException ex) when (ex.Message == \"Packet header is invalid.\") { LogCorruptHeader(); channel.Close(); }","preventionTips":["Never return null from DeserializePacketHeader; signal failure explicitly","Cover all header versions in the deserializer switch","Add unit tests for unknown/legacy header types","Null-check helper output before passing it on"],"tags":["network","deserialization","null-argument","gameframework"],"backgroundTag":"null-argument","analyzedSha":"d0c010b05167c58e92350449d04864a91ca13fd2","analyzedAt":"2026-09-15T13:37:15.352Z","contentChangedAt":"2026-09-15T13:37:15.352Z","schemaVersion":2},"datasetVersion":"2026-09-15T23:17:13.987Z"}