Repository navigation
fix(plugin): avoid BanClient before the player entity exists - #47
Merged
Merged
Conversation
VerifyBan runs from OnClientAuthorized, which can land before OnClientPutInServer. BanClient() resolves the client through ReferenceToIndex(), which returns -1 while the edict has no entity, so SourceMod threw "Client index -1 is invalid" and the banned player was never kicked. Ban the engine auth string with BanIdentity (keeps Synergy's native Steam3 form) and KickClient; when the auth lookup fails or the server is LAN, KickClientEx then ban the IP, matching BanClient's kick-then-addip order. Port of upstream sbpp#1580 (a418884). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Port of upstream sbpp#1580 (
a418884c).Problem
VerifyBanruns fromOnClientAuthorized, which can fire beforeOnClientPutInServer. Our fork bans there withBanClient(), which resolves the client viaReferenceToIndex(). That returns-1while the player has no entity, so SourceMod throwsClient index -1 is invalidand the banned player is never kicked.Fix
Use entity-independent natives that behave like
BanClient:GetClientAuthId(AuthId_Engine)+BanIdentity(..., BANFLAG_AUTHID), thenKickClient. This keeps the engine-native auth string, so Synergy still works.KickClientExthenBanIdentity(ip, BANFLAG_IP). Kicking first matchesBanClient's order.Our fork-specific bits are kept:
SetGlobalTransTarget+%tmessage and the"sbpp"command tag.The other
BanClientcall sites are safe.SBPP_BanIdentityalready checksIsClientInGame, andsm_banonly targets in-game players.Verification
spcomp isn't available locally, so the
plugin-buildCI gate does the compile. Signatures were checked by hand against the SourceMod API.🤖 Generated with Claude Code