fix: revert bedrock buffer read

This commit is contained in:
Alexander Medvedev 2026-05-24 17:36:27 +02:00
parent d9312141f6
commit 100b8791cf

View File

@ -9,7 +9,6 @@ use crate::net::java::{JavaClient, PacketHandlerResult};
use crate::net::{ClientPlatform, DisconnectReason}; use crate::net::{ClientPlatform, DisconnectReason};
use crate::net::{lan_broadcast::LANBroadcast, query, rcon::RCONServer}; use crate::net::{lan_broadcast::LANBroadcast, query, rcon::RCONServer};
use crate::server::{Server, ticker::Ticker}; use crate::server::{Server, ticker::Ticker};
use bytes::BytesMut;
use plugin::server::server_command::ServerCommandEvent; use plugin::server::server_command::ServerCommandEvent;
use pumpkin_config::{AdvancedConfiguration, BasicConfiguration}; use pumpkin_config::{AdvancedConfiguration, BasicConfiguration};
use pumpkin_macros::send_cancellable; use pumpkin_macros::send_cancellable;
@ -19,7 +18,7 @@ use rustyline::Editor;
use rustyline::history::FileHistory; use rustyline::history::FileHistory;
use rustyline::{Config, error::ReadlineError}; use rustyline::{Config, error::ReadlineError};
use std::collections::HashMap; use std::collections::HashMap;
use std::io::{ErrorKind, IsTerminal, stdin}; use std::io::{Cursor, ErrorKind, IsTerminal, stdin};
use std::process::exit; use std::process::exit;
use std::str::FromStr; use std::str::FromStr;
use std::sync::atomic::{AtomicBool, AtomicI32, Ordering}; use std::sync::atomic::{AtomicBool, AtomicI32, Ordering};
@ -425,7 +424,7 @@ impl PumpkinServer {
tasks: &Arc<TaskTracker>, tasks: &Arc<TaskTracker>,
bedrock_clients: &Arc<Mutex<HashMap<SocketAddr, Arc<BedrockClient>>>>, bedrock_clients: &Arc<Mutex<HashMap<SocketAddr, Arc<BedrockClient>>>>,
) -> bool { ) -> bool {
let mut udp_buf = BytesMut::with_capacity(1496); let mut udp_buf = [0; 1496]; // Buffer for UDP receive
select! { select! {
// Branch for TCP connections (Java Edition) // Branch for TCP connections (Java Edition)
@ -491,10 +490,7 @@ impl PumpkinServer {
}, },
// Branch for UDP packets (Bedrock Edition) // Branch for UDP packets (Bedrock Edition)
udp_result = resolve_some(self.udp_socket.as_ref(), |sock: &Arc<UdpSocket>| { udp_result = resolve_some(self.udp_socket.as_ref(), |sock: &Arc<UdpSocket>| sock.recv_from(&mut udp_buf)) => {
unsafe { udp_buf.set_len(1496) };
sock.recv_from(&mut udp_buf[..])
}) => {
match udp_result { match udp_result {
Ok((len, client_addr)) => { Ok((len, client_addr)) => {
if len > 0 { if len > 0 {
@ -518,19 +514,24 @@ impl PumpkinServer {
new_client new_client
}).clone(); }).clone();
let packet_bytes = udp_buf.split_to(len).freeze(); let packet_bytes = udp_buf[..len].to_vec();
udp_buf.clear();
let server = self.server.clone(); let server = self.server.clone();
tasks.spawn(async move { tasks.spawn(async move {
client.process_packet(&server, packet_bytes).await; client.process_packet(&server, packet_bytes.into()).await;
}); });
} else if let Some(sock) = self.udp_socket.as_ref() {
let _ = BedrockClient::handle_offline_packet(
&self.server,
id,
&mut Cursor::new(&udp_buf[1..len]),
client_addr,
sock
).await;
} }
} }
} }
Err(e) => { Err(e) => error!("UDP socket error: {e}"),
error!("Failed to receive UDP packet: {e}");
}
} }
}, },