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.api.plugin.Listener;
import net.md_5.bungee.protocol.ProtocolConstants; import net.md_5.bungee.protocol.ProtocolConstants;
import org.checkerframework.checker.nullness.qual.Nullable; import org.checkerframework.checker.nullness.qual.Nullable;
import org.geysermc.geyser.GeyserImpl;
import org.geysermc.geyser.ping.GeyserPingInfo; import org.geysermc.geyser.ping.GeyserPingInfo;
import org.geysermc.geyser.ping.IGeyserPingPassthrough; import org.geysermc.geyser.ping.IGeyserPingPassthrough;
@ -43,6 +44,7 @@ import java.net.InetSocketAddress;
import java.net.SocketAddress; import java.net.SocketAddress;
import java.util.UUID; import java.util.UUID;
import java.util.concurrent.CompletableFuture; import java.util.concurrent.CompletableFuture;
import java.util.concurrent.TimeUnit;
@AllArgsConstructor @AllArgsConstructor
public class GeyserBungeePingPassthrough implements IGeyserPingPassthrough, Listener { public class GeyserBungeePingPassthrough implements IGeyserPingPassthrough, Listener {
@ -59,7 +61,17 @@ public class GeyserBungeePingPassthrough implements IGeyserPingPassthrough, List
future.complete(event); 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(); ServerPing response = event.getResponse();
return new GeyserPingInfo( return new GeyserPingInfo(
response.getDescriptionComponent().toLegacyText(), response.getDescriptionComponent().toLegacyText(),

View file

@ -35,10 +35,10 @@ import java.net.InetSocketAddress;
public interface IGeyserPingPassthrough { 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 * @param inetSocketAddress the ip address of the client pinging the server
* @return string of the MOTD * @return the ping information
*/ */
@Nullable @Nullable
GeyserPingInfo getPingInformation(InetSocketAddress inetSocketAddress); GeyserPingInfo getPingInformation(InetSocketAddress inetSocketAddress);