Pumpkin-MC/Pumpkin · error · VineError
Failed to read forward version
Error message
Failed to read forward version
What it means
VineError::FailedReadForwardVersion is returned when the VarInt forwarding version cannot be decoded from the Vine response payload after signature verification (vine.rs:170-172). The payload passed the length and signature checks but its structure is not parseable as expected, so the server aborts instead of guessing the format.
Solutions
- Update the proxy to a version implementing the same Vine forwarding protocol as the server
- Verify the proxy's forwarding plugin/channel name matches vine:player_info and the expected payload format
- Inspect proxy logs to confirm it is sending the signed Vine payload, not some other data on that channel
Defensive patterns
Strategy: validation
Validate before calling
// after the 64-byte signature, the payload must start with a decodable VarInt
fn starts_with_var_int(payload: &[u8]) -> bool {
!payload.is_empty() && payload[0] != 0x80 // simple fast-reject; full decode happens in parser
} Try / catch
match receive_vine_plugin_response(port, &config, response, challenge) {
Err(VineError::FailedReadForwardVersion) => {
tracing::warn!("Vine payload not parseable; proxy protocol incompatible");
disconnect(DisconnectReason::InvalidForwarding);
}
result => result?,
} Prevention
- Use matching, official releases of the proxy and server for the Vine protocol
- Test the forwarding handshake after any proxy upgrade in a staging environment
- Keep proxy forwarding plugins updated to the canonical vine:player_info layout
- Log raw payload dumps at debug level to diagnose layout mismatches quickly
When it happens
Trigger: payload.get_var_int() errors in receive_vine_plugin_response because the bytes immediately after the 64-byte signature are not a valid VarInt — e.g. truncated data or a completely different payload layout from an incompatible proxy implementation.
Common situations: A proxy claims to support the vine:player_info channel but writes a different payload layout; a corrupted or truncated packet slipped past the minimum-length check; a custom/misconfigured proxy plugin responds with wrong data.
Related errors
- Failed to read address
- Vine response data too short (minimum 89 bytes)
- Failed to parse address
- Failed to read game profile name
- Failed to read game profile UUID
AI-assisted analysis of Pumpkin-MC/Pumpkin@8d4639e25a (2026-09-09).
Data as JSON: /api/errors/25bd7eb24e183a15.
Report an issue: GitHub.
Appendix: source
Thrown at crates/pumpkin/src/net/proxy/vine.rs:36
use crate::net::{GameProfile, java::pending::PendingConnection};
pub const VINE_PLAYER_INFO_CHANNEL: &str = "vine:player_info";
pub const VINE_FORWARDING_VERSION: i32 = 1;
pub const MAX_TIMESTAMP_DRIFT_SECS: i64 = 30;
#[derive(Error, Debug)]
pub enum VineError {
#[error("No response data received")]
NoData,
#[error("Vine response data too short (minimum 89 bytes)")]
DataTooShort,
#[error("No public key or secret configured for Vine proxy")]
MissingKeyConfig,
#[error("Invalid Ed25519 public key")]
InvalidPublicKey,
#[error("Failed to verify Ed25519 signature")]
InvalidSignature,
#[error("Failed to read forward version")]
FailedReadForwardVersion,
#[error("Unsupported forwarding version {0}. Expected {1}")]
UnsupportedForwardVersion(i32, i32),
#[error("Vine timestamp expired or desynchronized: skew of {0}s exceeds limit of {1}s")]
TimestampExpired(i64, i64),
#[error("Vine challenge nonce mismatch")]
ChallengeMismatch,
#[error("Missing expected challenge from pending connection")]
MissingChallenge,
#[error("Failed to read address")]
FailedReadAddress,
#[error("Failed to parse address")]
FailedParseAddress,
#[error("Failed to read game profile name")]
FailedReadProfileName,
#[error("Failed to read game profile UUID")]
FailedReadProfileUUID,
#[error("Failed to read game profile properties")]View on GitHub (pinned to 8d4639e25a)