Add Timeout to CompletableFuture in GeyserBungeePingPassthrough to Prevent Memory Leak (#4858)

* fix: Add timeout for GeyserBungeePingPassthrough#getPingInformation

Signed-off-by: ByteExceptionM <git@byteexception.eu>

* fix: Use Geyser Logger instead of Bungee Logger

Signed-off-by: ByteExceptionM <git@byteexception.eu>

* Fix typo

Co-authored-by: Konicai <71294714+Konicai@users.noreply.github.com>

* chore: Add ip suppression if configured

Signed-off-by: ByteExceptionM <git@byteexception.eu>

* Remove empty line

Co-authored-by: chris <github@onechris.mozmail.com>

* Remove empty line

Co-authored-by: chris <github@onechris.mozmail.com>

---------

Signed-off-by: ByteExceptionM <git@byteexception.eu>
Co-authored-by: Konicai <71294714+Konicai@users.noreply.github.com>
Co-authored-by: chris <github@onechris.mozmail.com>
This commit is contained in:
masel.io 2024-07-16 11:23:30 +02:00 committed by GitHub
parent 305495c923
commit 677a56cf6c
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 15 additions and 3 deletions

View file

@ -36,6 +36,7 @@ import net.md_5.bungee.api.event.ProxyPingEvent;
import net.md_5.bungee.api.plugin.Listener;
import net.md_5.bungee.protocol.ProtocolConstants;
import org.checkerframework.checker.nullness.qual.Nullable;
import org.geysermc.geyser.GeyserImpl;
import org.geysermc.geyser.ping.GeyserPingInfo;
import org.geysermc.geyser.ping.IGeyserPingPassthrough;
@ -43,6 +44,7 @@ import java.net.InetSocketAddress;
import java.net.SocketAddress;
import java.util.UUID;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.TimeUnit;
@AllArgsConstructor
public class GeyserBungeePingPassthrough implements IGeyserPingPassthrough, Listener {
@ -59,7 +61,17 @@ public class GeyserBungeePingPassthrough implements IGeyserPingPassthrough, List
future.complete(event);
}
}));
ProxyPingEvent event = future.join();
ProxyPingEvent event;
try {
event = future.get(100, TimeUnit.MILLISECONDS);
} catch (Throwable cause) {
String address = GeyserImpl.getInstance().getConfig().isLogPlayerIpAddresses() ? inetSocketAddress.toString() : "<IP address withheld>";
GeyserImpl.getInstance().getLogger().error("Failed to get ping information for " + address, cause);
return null;
}
ServerPing response = event.getResponse();
return new GeyserPingInfo(
response.getDescriptionComponent().toLegacyText(),

View file

@ -35,10 +35,10 @@ import java.net.InetSocketAddress;
public interface IGeyserPingPassthrough {
/**
* Get the MOTD of the server displayed on the multiplayer screen
* Gets the ping information, including the MOTD and player count, from the server
*
* @param inetSocketAddress the ip address of the client pinging the server
* @return string of the MOTD
* @return the ping information
*/
@Nullable
GeyserPingInfo getPingInformation(InetSocketAddress inetSocketAddress);