oωo (owo-lib)

oωo (owo-lib)

17M Downloads

"java.lang.IndexOutOfBoundsException: null" when connecting to Fabric server behind Velocity proxy

unilock opened this issue · 3 comments

commented

I'm running an All of Fabric 5 v1.3.0 server behind Velocity. I've installed FabricProxy-Lite and CrossStitch on the AOF5 server, as recommended by the Velocity docs, as well as owo-velocity-plugin on the Velocity server.

Initially, I was having the same issue as #15 and #21, but this was solved by installing owo-velocity-plugin, as mentioned above.

Now I'm running into Internal Exception: java.lang.IndexOutOfBoundsException whenever I try to connect to the server through Velocity. (Connecting directly to the port the AOF5 server is running on works fine, but is obviously not optimal.)

The Velocity log only shows [initial connection] /<IP addr>:<port> has disconnected, while the AOF5 log doesn't show anything at all.

Here is the relevant bit of the error log I'm getting on the client:

[07:22:00] [Netty Epoll Client IO #0/INFO]: [Handshake] Sending client channels
[07:22:00] [Netty Epoll Client IO #0/ERROR]: Encountered exception while handling in channel with name "owo:handshake"
java.lang.IndexOutOfBoundsException: null
	at io.netty.buffer.EmptyByteBuf.readByte(EmptyByteBuf.java:523) ~[netty-all-4.1.68.Final.jar:?]
	at net.minecraft.class_2540.readByte(class_2540.java:1013) ~[client-intermediary.jar:?]
	at net.minecraft.class_2540.method_10816(class_2540.java:344) ~[client-intermediary.jar:?]
	at net.minecraft.class_2540.method_34069(class_2540.java:154) ~[client-intermediary.jar:?]
	at io.wispforest.owo.network.serialization.PacketBufSerializer.lambda$createMapSerializer$2(PacketBufSerializer.java:203) ~[owo-lib-0.7.2-no-cme+1.18.jar:?]
	at io.wispforest.owo.network.OwoHandshake.syncClient(OwoHandshake.java:104) ~[owo-lib-0.7.2-no-cme+1.18.jar:?]
	at net.fabricmc.fabric.impl.networking.client.ClientLoginNetworkAddon.handlePacket(ClientLoginNetworkAddon.java:85) [fabric-networking-api-v1-1.0.22+e6b169eb60-134892b2de16cba2.jar:?]
	at net.fabricmc.fabric.impl.networking.client.ClientLoginNetworkAddon.handlePacket(ClientLoginNetworkAddon.java:59) [fabric-networking-api-v1-1.0.22+e6b169eb60-134892b2de16cba2.jar:?]
	at net.minecraft.class_635.handler$eap000$handleQueryRequest(class_635.java:554) [client-intermediary.jar:?]
	at net.minecraft.class_635.method_12586(class_635.java:154) [client-intermediary.jar:?]
	at net.minecraft.class_2899.method_12591(class_2899.java:39) [client-intermediary.jar:?]
	at net.minecraft.class_2899.method_11054(class_2899.java:7) [client-intermediary.jar:?]
	at net.minecraft.class_2535.method_10759(class_2535.java:172) [client-intermediary.jar:?]
	at net.minecraft.class_2535.method_10770(class_2535.java:157) [client-intermediary.jar:?]
	at net.minecraft.class_2535.channelRead0(class_2535.java:55) [client-intermediary.jar:?]
	at io.netty.channel.SimpleChannelInboundHandler.channelRead(SimpleChannelInboundHandler.java:99) [netty-all-4.1.68.Final.jar:?]
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379) [netty-all-4.1.68.Final.jar:?]
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365) [netty-all-4.1.68.Final.jar:?]
	at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357) [netty-all-4.1.68.Final.jar:?]
	at io.netty.handler.codec.ByteToMessageDecoder.fireChannelRead(ByteToMessageDecoder.java:324) [netty-all-4.1.68.Final.jar:?]
	at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:296) [netty-all-4.1.68.Final.jar:?]
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379) [netty-all-4.1.68.Final.jar:?]
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365) [netty-all-4.1.68.Final.jar:?]
	at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357) [netty-all-4.1.68.Final.jar:?]
	at io.netty.handler.codec.ByteToMessageDecoder.fireChannelRead(ByteToMessageDecoder.java:324) [netty-all-4.1.68.Final.jar:?]
	at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:296) [netty-all-4.1.68.Final.jar:?]
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379) [netty-all-4.1.68.Final.jar:?]
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365) [netty-all-4.1.68.Final.jar:?]
	at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357) [netty-all-4.1.68.Final.jar:?]
	at io.netty.handler.timeout.IdleStateHandler.channelRead(IdleStateHandler.java:286) [netty-all-4.1.68.Final.jar:?]
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379) [netty-all-4.1.68.Final.jar:?]
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365) [netty-all-4.1.68.Final.jar:?]
	at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357) [netty-all-4.1.68.Final.jar:?]
	at io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1410) [netty-all-4.1.68.Final.jar:?]
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379) [netty-all-4.1.68.Final.jar:?]
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365) [netty-all-4.1.68.Final.jar:?]
	at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:919) [netty-all-4.1.68.Final.jar:?]
	at io.netty.channel.epoll.AbstractEpollStreamChannel$EpollStreamUnsafe.epollInReady(AbstractEpollStreamChannel.java:795) [netty-all-4.1.68.Final.jar:?]
	at io.netty.channel.epoll.EpollEventLoop.processReady(EpollEventLoop.java:480) [netty-all-4.1.68.Final.jar:?]
	at io.netty.channel.epoll.EpollEventLoop.run(EpollEventLoop.java:378) [netty-all-4.1.68.Final.jar:?]
	at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:986) [netty-all-4.1.68.Final.jar:?]
	at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74) [netty-all-4.1.68.Final.jar:?]
	at java.lang.Thread.run(Thread.java:833) [?:?]
[07:22:00] [Netty Epoll Client IO #0/ERROR]: Exception occurred in netty pipeline
java.lang.IndexOutOfBoundsException: null
	at io.netty.buffer.EmptyByteBuf.readByte(EmptyByteBuf.java:523) ~[netty-all-4.1.68.Final.jar:?]
	at net.minecraft.class_2540.readByte(class_2540.java:1013) ~[client-intermediary.jar:?]
	at net.minecraft.class_2540.method_10816(class_2540.java:344) ~[client-intermediary.jar:?]
	at net.minecraft.class_2540.method_34069(class_2540.java:154) ~[client-intermediary.jar:?]
	at io.wispforest.owo.network.serialization.PacketBufSerializer.lambda$createMapSerializer$2(PacketBufSerializer.java:203) ~[owo-lib-0.7.2-no-cme+1.18.jar:?]
	at io.wispforest.owo.network.OwoHandshake.syncClient(OwoHandshake.java:104) ~[owo-lib-0.7.2-no-cme+1.18.jar:?]
	at net.fabricmc.fabric.impl.networking.client.ClientLoginNetworkAddon.handlePacket(ClientLoginNetworkAddon.java:85) ~[fabric-networking-api-v1-1.0.22+e6b169eb60-134892b2de16cba2.jar:?]
	at net.fabricmc.fabric.impl.networking.client.ClientLoginNetworkAddon.handlePacket(ClientLoginNetworkAddon.java:59) ~[fabric-networking-api-v1-1.0.22+e6b169eb60-134892b2de16cba2.jar:?]
	at net.minecraft.class_635.handler$eap000$handleQueryRequest(class_635.java:554) ~[client-intermediary.jar:?]
	at net.minecraft.class_635.method_12586(class_635.java:154) ~[client-intermediary.jar:?]
	at net.minecraft.class_2899.method_12591(class_2899.java:39) ~[client-intermediary.jar:?]
	at net.minecraft.class_2899.method_11054(class_2899.java:7) ~[client-intermediary.jar:?]
	at net.minecraft.class_2535.method_10759(class_2535.java:172) ~[client-intermediary.jar:?]
	at net.minecraft.class_2535.method_10770(class_2535.java:157) ~[client-intermediary.jar:?]
	at net.minecraft.class_2535.channelRead0(class_2535.java:55) ~[client-intermediary.jar:?]
	at io.netty.channel.SimpleChannelInboundHandler.channelRead(SimpleChannelInboundHandler.java:99) ~[netty-all-4.1.68.Final.jar:?]
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379) [netty-all-4.1.68.Final.jar:?]
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365) [netty-all-4.1.68.Final.jar:?]
	at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357) [netty-all-4.1.68.Final.jar:?]
	at io.netty.handler.codec.ByteToMessageDecoder.fireChannelRead(ByteToMessageDecoder.java:324) [netty-all-4.1.68.Final.jar:?]
	at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:296) [netty-all-4.1.68.Final.jar:?]
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379) [netty-all-4.1.68.Final.jar:?]
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365) [netty-all-4.1.68.Final.jar:?]
	at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357) [netty-all-4.1.68.Final.jar:?]
	at io.netty.handler.codec.ByteToMessageDecoder.fireChannelRead(ByteToMessageDecoder.java:324) [netty-all-4.1.68.Final.jar:?]
	at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:296) [netty-all-4.1.68.Final.jar:?]
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379) [netty-all-4.1.68.Final.jar:?]
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365) [netty-all-4.1.68.Final.jar:?]
	at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357) [netty-all-4.1.68.Final.jar:?]
	at io.netty.handler.timeout.IdleStateHandler.channelRead(IdleStateHandler.java:286) [netty-all-4.1.68.Final.jar:?]
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379) [netty-all-4.1.68.Final.jar:?]
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365) [netty-all-4.1.68.Final.jar:?]
	at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357) [netty-all-4.1.68.Final.jar:?]
	at io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1410) [netty-all-4.1.68.Final.jar:?]
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379) [netty-all-4.1.68.Final.jar:?]
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365) [netty-all-4.1.68.Final.jar:?]
	at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:919) [netty-all-4.1.68.Final.jar:?]
	at io.netty.channel.epoll.AbstractEpollStreamChannel$EpollStreamUnsafe.epollInReady(AbstractEpollStreamChannel.java:795) [netty-all-4.1.68.Final.jar:?]
	at io.netty.channel.epoll.EpollEventLoop.processReady(EpollEventLoop.java:480) [netty-all-4.1.68.Final.jar:?]
	at io.netty.channel.epoll.EpollEventLoop.run(EpollEventLoop.java:378) [netty-all-4.1.68.Final.jar:?]
	at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:986) [netty-all-4.1.68.Final.jar:?]
	at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74) [netty-all-4.1.68.Final.jar:?]
	at java.lang.Thread.run(Thread.java:833) [?:?]

Here's my Velocity config:

# Config version. Do not change this
config-version = "2.0"

# What port should the proxy be bound to? By default, we'll bind to all addresses on port 25577.
bind = "0.0.0.0:25565"

# What should be the MOTD? This gets displayed when the player adds your server to
# their server list. Legacy color codes and JSON are accepted.
motd = "velocity test"

# What should we display for the maximum number of players? (Velocity does not support a cap
# on the number of players online.)
show-max-players = 1337

# Should we authenticate players with Mojang? By default, this is on.
online-mode = true

# Should the proxy enforce the new public key security standard? By default, this is on.
force-key-authentication = true

# If client's ISP/AS sent from this proxy is different from the one from Mojang's
# authentication server, the player is kicked. This disallows some VPN and proxy
# connections but is a weak form of protection.
prevent-client-proxy-connections = false

# Should we forward IP addresses and other data to backend servers?
# Available options:
# - "none":        No forwarding will be done. All players will appear to be connecting
#                  from the proxy and will have offline-mode UUIDs.
# - "legacy":      Forward player IPs and UUIDs in a BungeeCord-compatible format. Use this
#                  if you run servers using Minecraft 1.12 or lower.
# - "bungeeguard": Forward player IPs and UUIDs in a format supported by the BungeeGuard
#                  plugin. Use this if you run servers using Minecraft 1.12 or lower, and are
#                  unable to implement network level firewalling (on a shared host).
# - "modern":      Forward player IPs and UUIDs as part of the login process using
#                  Velocity's native forwarding. Only applicable for Minecraft 1.13 or higher.
player-info-forwarding-mode = "modern"

# If you are using modern or BungeeGuard IP forwarding, configure a file that contains a unique secret here.
# The file is expected to be UTF-8 encoded and not empty.
forwarding-secret-file = "forwarding.secret"

# Announce whether or not your server supports Forge. If you run a modded server, we
# suggest turning this on.
# 
# If your network runs one modpack consistently, consider using ping-passthrough = "mods"
# instead for a nicer display in the server list.
announce-forge = false

# If enabled (default is false) and the proxy is in online mode, Velocity will kick
# any existing player who is online if a duplicate connection attempt is made.
kick-existing-players = false

# Should Velocity pass server list ping requests to a backend server?
# Available options:
# - "disabled":    No pass-through will be done. The velocity.toml and server-icon.png
#                  will determine the initial server list ping response.
# - "mods":        Passes only the mod list from your backend server into the response.
#                  The first server in your try list (or forced host) with a mod list will be
#                  used. If no backend servers can be contacted, Velocity won't display any
#                  mod information.
# - "description": Uses the description and mod list from the backend server. The first
#                  server in the try (or forced host) list that responds is used for the
#                  description and mod list.
# - "all":         Uses the backend server's response as the proxy response. The Velocity
#                  configuration is used if no servers could be contacted.
ping-passthrough = "all"

# If not enabled (default is true) player IP addresses will be replaced by <ip address withheld> in logs
enable-player-address-logging = true

[servers]
# Configure your servers here. Each key represents the server's name, and the value
# represents the IP address of the server to connect to.
vanilla = "127.0.0.1:30000"
mini = "127.0.0.1:30020"
aof5 = "127.0.0.1:30010"

# In what order we should try servers when a player logs in or is kicked from a server.
try = [
  "vanilla"
]

[forced-hosts]
# Configure your forced hosts here.
"play.example.com" = [
  "vanilla"
]
"mini.example.com" = [
  "mini"
]
"aof5.example.com" = [
  "aof5"
]

[advanced]
# How large a Minecraft packet has to be before we compress it. Setting this to zero will
# compress all packets, and setting it to -1 will disable compression entirely.
compression-threshold = 256

# How much compression should be done (from 0-9). The default is -1, which uses the
# default level of 6.
compression-level = -1

# How fast (in milliseconds) are clients allowed to connect after the last connection? By
# default, this is three seconds. Disable this by setting this to 0.
login-ratelimit = 3000

# Specify a custom timeout for connection timeouts here. The default is five seconds.
connection-timeout = 5000

# Specify a read timeout for connections here. The default is 30 seconds.
read-timeout = 30000

# Enables compatibility with HAProxy's PROXY protocol. If you don't know what this is for, then
# don't enable it.
haproxy-protocol = false

# Enables TCP fast open support on the proxy. Requires the proxy to run on Linux.
tcp-fast-open = false

# Enables BungeeCord plugin messaging channel support on Velocity.
bungee-plugin-message-channel = true

# Shows ping requests to the proxy from clients.
show-ping-requests = false

# By default, Velocity will attempt to gracefully handle situations where the user unexpectedly
# loses connection to the server without an explicit disconnect message by attempting to fall the
# user back, except in the case of read timeouts. BungeeCord will disconnect the user instead. You
# can disable this setting to use the BungeeCord behavior.
failover-on-unexpected-server-disconnect = true

# Declares the proxy commands to 1.13+ clients.
announce-proxy-commands = true

# Enables the logging of commands
log-command-executions = false

# Enables logging of player connections when connecting to the proxy, switching servers
# and disconnecting from the proxy.
log-player-connections = true

[query]
# Whether to enable responding to GameSpy 4 query responses or not.
enabled = false

# If query is enabled, on what port should the query protocol listen on?
port = 25565

# This is the map name that is reported to the query services.
map = "velocity"

# Whether plugins should be shown in query response by default or not
show-plugins = false

Let me know what you think. If this is more of a problem with Velocity, Fabric itself, one of the Velocity compatibility Fabric mods, etc. - do let me know.

commented

It was merged so fast I could not even make it auto-close. Hopefully this check should prevent this issue from occuring.

commented

I was just able to test connecting client -> proxy -> server with this setup:

Client - MC 1.18.2 - Fabric 0.14.8

  • fabric-api-0.57.0+1.18.2
  • owo-lib-0.7.2-no-cme+1.18

Proxy - Velocity (same as above)

Server - MC 1.18.2 - Fabric 0.14.8

  • crossstitch-0.1.4
  • fabric-api-0.57.0+1.18.2
  • FabricProxy-Lite-1.1.6
  • owo-lib-0.7.2-no-cme+1.18

... No issue. The client connects to the server without error using the latest 1.18.2 release of owo-lib, without your fix.

Maybe it's a mod conflict? Unfortunately I can't fully test the artifact produced by your commit, as the modpack I'm using (All of Fabric 5) is running on 1.18.2, while owo-lib's actions currently build for 1.19.

As an aside, would it be possible to implement this fix in owo-velocity-plugin itself? For backwards compatibility. (and mostly so I don't have to bug my players to manually install an updated version of owo-lib to play on my server...)
(I don't know Java very well, so please excuse my ignorance :) )

commented

I was able to merge your commit with the 1.18.2 branch and compile it myself. (https://github.com/unilock/owo-lib/tree/1.18.2)
The handshake now completes, and as far as I can tell, it works!

Though, of course, there's now another issue, this time with ThonkUtil. Fortunately it's already been fixed: LimeAppleBoat/ThonkUtil#25 (comment)

I can make a pull request if you like, or you could make your own, since you did all the work :)