Pumpkin-MC/Pumpkin · error · VineError

Failed to read game profile UUID

Error message

Failed to read game profile UUID

What it means

This is the VineProxyError::FailedReadProfileUUID variant. It means the server could not read the player's UUID from the Vine proxy forwarding response — the bytes ran out or were malformed at the UUID field. The UUID is required to identify the authenticated player, so decoding is aborted.

Solutions

  1. Match the forwarding protocol implementation on both proxy and server
  2. Check the proxy writes fields in Vine spec order (address, then profile name, UUID, properties)
  3. Update proxy and Pumpkin together
  4. Enable debug logging on the proxy to confirm what it sends

Example fix

null
Defensive patterns

Strategy: try-catch

Validate before calling

null

Type guard

null

Try / catch

match result { Err(VineProxyError::FailedReadProfileUUID) => { warn!("truncated forwarding payload: no profile UUID"); connection.disconnect(); }, Ok(v) => v, Err(e) => return Err(e) }

Prevention

When it happens

Trigger: Raised when decoding the Vine forwarding payload and the 16-byte UUID cannot be read (buffer exhausted or misaligned fields earlier in the payload).

Common situations: Forwarding payload written by a proxy with wrong field order/sizes; protocol version drift between proxy and server; corrupted packets over the connection.

Related errors


AI-assisted analysis of Pumpkin-MC/Pumpkin@8d4639e25a (2026-09-09). Data as JSON: /api/errors/9dc81b2d988f96d4. Report an issue: GitHub.

Appendix: source

Thrown at crates/pumpkin/src/net/proxy/vine.rs:52

    #[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")]
    FailedReadProfileProperties,
}

/// Initiates Vine modern forwarding handshake by sending a `CLoginPluginRequest`
/// with a unique 16-byte challenge nonce to protect against replay attacks.
pub async fn vine_login(connection: &mut PendingConnection) {
    let message_id: i32 = rand::random();
    let challenge: [u8; 16] = rand::random();

    let mut buf = BytesMut::with_capacity(17);
    buf.put_u8(VINE_FORWARDING_VERSION as u8);
    buf.put_slice(&challenge);

    connection.vine_challenge = Some(challenge);

    connection

View on GitHub (pinned to 8d4639e25a)