{"record":{"id":"783aac9118a9c437","repo":"Pumpkin-MC/Pumpkin","slug":"invalid-player-input-flag-flag","errorCode":null,"errorMessage":"invalid player input flag {flag}","messagePattern":"invalid player input flag (.+?)","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"crates/pumpkin-protocol/src/bedrock/server/player_auth_input.rs","lineNumber":58,"sourceCode":"    fn read<R: Read>(reader: &mut R) -> Result<Self, Error> {\n        let pitch = f32::read(reader)?;\n        let yaw = f32::read(reader)?;\n        let position = Vector3::<f32>::read(reader)?;\n        let move_vec = Vector2::<f32>::read(reader)?;\n        let head_yaw = f32::read(reader)?;\n        let mut input_data = Bitset::<66>::default();\n        if bool::read(reader)? {\n            let count = VarUInt::read(reader)?.0;\n            if count > 66 {\n                return Err(Error::new(\n                    ErrorKind::InvalidData,\n                    format!(\"too many player input flags: {count}\"),\n                ));\n            }\n            for _ in 0..count {\n                let flag = VarInt::read(reader)?.0;\n                if !(0..66).contains(&flag) {\n                    return Err(Error::new(\n                        ErrorKind::InvalidData,\n                        format!(\"invalid player input flag {flag}\"),\n                    ));\n                }\n                if input_data.get(flag as usize) {\n                    return Err(Error::new(\n                        ErrorKind::InvalidData,\n                        format!(\"duplicate player input flag {flag}\"),\n                    ));\n                }\n                input_data.set(flag as usize, true);\n            }\n        }\n        let input_mode = VarUInt::read(reader)?;\n        let play_mode = VarUInt::read(reader)?;\n        let interaction_model = VarInt::read(reader)?;\n        let interact_pitch = f32::read(reader)?;\n        let interact_yaw = f32::read(reader)?;","sourceCodeStart":40,"sourceCodeEnd":76,"githubUrl":"https://github.com/Pumpkin-MC/Pumpkin/blob/8d4639e25a57c15e47448ec327c780d41bbf2356/crates/pumpkin-protocol/src/bedrock/server/player_auth_input.rs#L40-L76","documentation":"Thrown when an individual player input flag VarInt in a PlayerAuthInput packet falls outside 0..66 (or, in the immediately following check, duplicates a flag already set in the Bitset<66>). Flag values are indices into the 66-bit input bitmap, so out-of-range values indicate malformed data. The decoder returns an InvalidData error.","triggerScenarios":"A client sends a PlayerAuthInput with a flag id < 0 or >= 66 (or the same flag twice); caused by malformed/fuzzed packets, modified clients, or stream misalignment from an earlier bad length/count read.","commonSituations":"Version skew between client and server flag enumerations, cheat or bot clients emitting raw flag values, packet corruption over unreliable transport.","solutions":["Check that client and server protocol versions (and thus flag enums) match","Log the offending flag value to map it against the current flag enum","Ensure the preceding count field parsed correctly (guards against earlier desync)","Update the flag enum in pumpkin-protocol if a newer protocol redefined indices"],"exampleFix":"// before\nlet flag = VarInt(-3);\n// after\nlet flag = VarInt(5); // must be within 0..66 and not already set","handlingStrategy":"validation","validationCode":"fn input_flag_ok(flag: i32, seen: &Bitset<66>) -> bool { (0..66).contains(&flag) && !seen.get(flag as usize) }","typeGuard":"fn to_flag(v: i32) -> Option<usize> { usize::try_from(v).ok().filter(|&f| f < 66) }","tryCatchPattern":"if let Err(e) = PlayerAuthInput::read(reader) {\n    if e.to_string().contains(\"invalid player input flag\") { log_bad_input(peer, &e); return Ok(()); }\n    return Err(e.into());\n}","preventionTips":["Use the server's flag enum, never raw client ints, when constructing packets","Sync the input-flag enum after every Bedrock protocol update","Track and kick clients emitting duplicate or out-of-range flags"],"tags":["protocol","bedrock","deserialization","invalid-enum","input"],"backgroundTag":"invalid-flag-value","analyzedSha":"8d4639e25a57c15e47448ec327c780d41bbf2356","analyzedAt":"2026-09-09T15:32:22.916Z","contentChangedAt":"2026-09-09T15:32:22.916Z","schemaVersion":2},"datasetVersion":"2026-09-16T04:17:20.429Z"}