mirror of
https://github.com/go-gost/x.git
synced 2026-10-19 16:16:32 +00:00
waterutil.IsIPv4 and IsIPv6 index packet[0] with no length check, and a tun device can legally return zero bytes with no error — an Android VpnService fd does exactly that. routing such a read into a classifier panics with "index out of range [0] with length 0", and in the c-shared library the phone loads the runtime cannot unwind past the cgo boundary, so the panic took the app: the spoke died on 2026-10-12 with three such lines in crash.log, no stack, and a 17-minute gap before Android restarted it. The knowledge was already in the tree — sourceOf and destinationOf in handler/tun/p2p.go carry the guard, with a comment naming this exact panic — but the eight reads in the client and server loops and the association classifier in handler/router did not. The asymmetry was the bug. The guard now lives once, in internal/util/tun, as IPv4Packet and IPv6Packet, and every classifier goes through it. Tested at the real entry point: a fake device that returns (0, nil) before handing over a real IPv4 packet, asserted to be survived and forwarded.