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

  1. Update the proxy to a version implementing the same Vine forwarding protocol as the server
  2. Verify the proxy's forwarding plugin/channel name matches vine:player_info and the expected payload format
  3. 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

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


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)