Skip to content

Commit

Permalink
Merge pull request #3060 from Arthri/fix-infinities
Browse files Browse the repository at this point in the history
Bounce infinite or NaN player, projectile, or item velocity / position
  • Loading branch information
hakusaro authored Mar 9, 2025
2 parents c9cbee1 + 2564444 commit 83db803
Show file tree
Hide file tree
Showing 2 changed files with 41 additions and 0 deletions.
40 changes: 40 additions & 0 deletions TShockAPI/Bouncer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -504,6 +504,14 @@ internal void OnPlayerUpdate(object sender, GetDataHandlers.PlayerUpdateEventArg
return;
}

if (!float.IsFinite(pos.X) || !float.IsFinite(pos.Y))
{
TShock.Log.ConsoleInfo(GetString("Bouncer / OnPlayerUpdate force kicked (attempted to set position to infinity or NaN) from {0}", args.Player.Name));
args.Player.Kick(GetString("Detected DOOM set to ON position."), true, true);
args.Handled = true;
return;
}

if (pos.X < 0 || pos.Y < 0 || pos.X >= Main.maxTilesX * 16 - 16 || pos.Y >= Main.maxTilesY * 16 - 16)
{
TShock.Log.ConsoleDebug(GetString("Bouncer / OnPlayerUpdate rejected from (position check) {0}", args.Player.Name));
Expand Down Expand Up @@ -1072,6 +1080,22 @@ internal void OnItemDrop(object sender, GetDataHandlers.ItemDropEventArgs args)
bool noDelay = args.NoDelay;
short type = args.Type;

if (!float.IsFinite(pos.X) || !float.IsFinite(pos.Y))
{
TShock.Log.ConsoleInfo(GetString("Bouncer / OnItemDrop force kicked (attempted to set position to infinity or NaN) from {0}", args.Player.Name));
args.Player.Kick(GetString("Detected DOOM set to ON position."), true, true);
args.Handled = true;
return;
}

if (!float.IsFinite(vel.X) || !float.IsFinite(vel.Y))
{
TShock.Log.ConsoleInfo(GetString("Bouncer / OnItemDrop force kicked (attempted to set velocity to infinity or NaN) from {0}", args.Player.Name));
args.Player.Kick(GetString("Detected DOOM set to ON position."), true, true);
args.Handled = true;
return;
}

// player is attempting to crash clients
if (type < -48 || type >= Terraria.ID.ItemID.Count)
{
Expand Down Expand Up @@ -1175,6 +1199,22 @@ internal void OnNewProjectile(object sender, GetDataHandlers.NewProjectileEventA
int index = args.Index;
float[] ai = args.Ai;

if (!float.IsFinite(pos.X) || !float.IsFinite(pos.Y))
{
TShock.Log.ConsoleInfo(GetString("Bouncer / OnNewProjectile force kicked (attempted to set position to infinity or NaN) from {0}", args.Player.Name));
args.Player.Kick(GetString("Detected DOOM set to ON position."), true, true);
args.Handled = true;
return;
}

if (!float.IsFinite(vel.X) || !float.IsFinite(vel.Y))
{
TShock.Log.ConsoleInfo(GetString("Bouncer / OnNewProjectile force kicked (attempted to set velocity to infinity or NaN) from {0}", args.Player.Name));
args.Player.Kick(GetString("Detected DOOM set to ON position."), true, true);
args.Handled = true;
return;
}

if (index > Main.maxProjectiles)
{
TShock.Log.ConsoleDebug(GetString("Bouncer / OnNewProjectile rejected from above projectile limit from {0}", args.Player.Name));
Expand Down
1 change: 1 addition & 0 deletions docs/changelog.md
Original file line number Diff line number Diff line change
Expand Up @@ -95,6 +95,7 @@ Use past tense when adding new entries; sign your name off when you add or chang
* * Ensured `TSPlayer.PlayerData` is non-null whilst syncing loadouts. (@drunderscore)
* * Detected invalid installations, by checking for a file named `TerrariaServer.exe`. (@drunderscore)
* This made the two most common installation mistakes (extracting into the Terraria client directory, and extracting TShock 5 or newer into a TShock 4 or older install) prompt the user with a more useful diagnostic, rather than (likely) crashing moments later.
* Changed Bouncer to block updates which set the following fields to infinity or NaN: player position, projectile position, projectile velocity, item position, and item velocity. (@Arthri)
* Updated `TShockAPI.Handlers.SendTileRectHandler` (@LaoSparrow):
* Fixed incorrect validating range in `TileRectMatch.MatchRemoval`.
* Fixed tile rect changes (e.g. turning on and off campfires) are not synced between clients.
Expand Down

0 comments on commit 83db803

Please sign in to comment.