Pumpkin-MC/Pumpkin · error · VineError

Failed to read game profile properties

Error message

Failed to read game profile properties

What it means

This is the VineProxyError::FailedReadProfileProperties variant. It means the server failed to read the game profile properties list (e.g. textures/skins data) from the Vine proxy forwarding response. The payload was truncated or malformed at the properties section, so login is rejected.

Solutions

  1. Verify the proxy writes the properties list with a correct varint count and per-property encoding
  2. Confirm the forwarding secret matches between proxy and server (tampered payloads corrupt decoding)
  3. Use a maintained proxy version compatible with this Pumpkin build
  4. If security is less of a concern, check whether the proxy intentionally strips properties and whether the server build supports that

Example fix

null
Defensive patterns

Strategy: try-catch

Validate before calling

null

Type guard

null

Try / catch

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

Prevention

When it happens

Trigger: Raised when decoding the properties array (count plus per-property name/value/signature strings) at the end of the Vine forwarding payload and the bytes are incomplete or invalid.

Common situations: Proxy omitting properties or writing a wrong property count; offline-mode proxies that strip skin data incorrectly; corrupted payload due to secret mismatch or tampering.

Related errors


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

Appendix: source

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

    #[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
        .send_packet_now(&CLoginPluginRequest::new(
            message_id.into(),

View on GitHub (pinned to 8d4639e25a)