From 0728784b8bd31b2c7a510ee40a9fca7d05649aff Mon Sep 17 00:00:00 2001 From: Joonas Rikkonen Date: Sun, 22 Jul 2018 17:50:29 +0300 Subject: [PATCH] Added invalid value checks to PhysicsBody property setters & item.SetTransform, checking for excessively large values --- .../BarotraumaShared/Source/Items/Item.cs | 14 +++++ .../Source/Physics/PhysicsBody.cs | 57 ++++++++++++------- 2 files changed, 49 insertions(+), 22 deletions(-) diff --git a/Barotrauma/BarotraumaShared/Source/Items/Item.cs b/Barotrauma/BarotraumaShared/Source/Items/Item.cs index 4e3d6f8e4..42fb6979a 100644 --- a/Barotrauma/BarotraumaShared/Source/Items/Item.cs +++ b/Barotrauma/BarotraumaShared/Source/Items/Item.cs @@ -532,6 +532,20 @@ namespace Barotrauma public void SetTransform(Vector2 simPosition, float rotation, bool findNewHull = true) { + if (!MathUtils.IsValid(simPosition)) + { + string errorMsg = + "Attempted to move the item " + Name + + " to an invalid position (" + simPosition + ")\n" + Environment.StackTrace; + + DebugConsole.ThrowError(errorMsg); + GameAnalyticsManager.AddErrorEventOnce( + "Item.SetPosition:InvalidPosition" + ID, + GameAnalyticsSDK.Net.EGAErrorSeverity.Error, + errorMsg); + return; + } + if (body != null) { try diff --git a/Barotrauma/BarotraumaShared/Source/Physics/PhysicsBody.cs b/Barotrauma/BarotraumaShared/Source/Physics/PhysicsBody.cs index 4972e4f70..fd71f11a2 100644 --- a/Barotrauma/BarotraumaShared/Source/Physics/PhysicsBody.cs +++ b/Barotrauma/BarotraumaShared/Source/Physics/PhysicsBody.cs @@ -125,8 +125,7 @@ namespace Barotrauma } else { - if (!MathUtils.IsValid((Vector2)value)) return; - + if (!IsValidValue(value.Value, "target position", -1e5f, 1e5f)) return; targetPosition = new Vector2( MathHelper.Clamp(((Vector2)value).X, -10000.0f, 10000.0f), MathHelper.Clamp(((Vector2)value).Y, -10000.0f, 10000.0f)); @@ -145,7 +144,7 @@ namespace Barotrauma } else { - if (!MathUtils.IsValid((float)value)) return; + if (!IsValidValue(value.Value, "target rotation")) return; targetRotation = value; } @@ -223,13 +222,21 @@ namespace Barotrauma public Vector2 LinearVelocity { get { return body.LinearVelocity; } - set { body.LinearVelocity = value; } + set + { + if (!IsValidValue(value, "velocity", -1000.0f, 1000.0f)) return; + body.LinearVelocity = value; + } } public float AngularVelocity { get { return body.AngularVelocity; } - set { body.AngularVelocity = value; } + set + { + if (!IsValidValue(value, "angular velocity")) return; + body.AngularVelocity = value; + } } public float Mass @@ -360,18 +367,21 @@ namespace Barotrauma this.radius = radius; } - private bool IsValidValue(float value, string valueName) + public bool IsValidValue(float value, string valueName, float? minValue = null, float? maxValue = null) { - if (!MathUtils.IsValid(value)) + if (!MathUtils.IsValid(value) || + (minValue.HasValue && value < minValue.Value) || + (maxValue.HasValue && value > maxValue.Value)) { + string userData = UserData == null ? "null" : UserData.ToString(); string errorMsg = "Attempted to apply invalid " + valueName + - " to a physics body (userdata: " + UserData == null ? "null" : UserData.ToString() + + " to a physics body (userdata: " + userData + "), value: " + value + "\n" + Environment.StackTrace; DebugConsole.ThrowError(errorMsg); GameAnalyticsManager.AddErrorEventOnce( - "PhysicsBody.SetPosition:InvalidPosition", + "PhysicsBody.SetPosition:InvalidPosition" + userData, GameAnalyticsSDK.Net.EGAErrorSeverity.Error, errorMsg); return false; @@ -379,18 +389,21 @@ namespace Barotrauma return true; } - private bool IsValidValue(Vector2 value, string valueName) + private bool IsValidValue(Vector2 value, string valueName, float? minValue = null, float? maxValue = null) { - if (!MathUtils.IsValid(value)) + if (!MathUtils.IsValid(value) || + (minValue.HasValue && (value.X < minValue.Value || value.Y < minValue.Value)) || + (maxValue.HasValue && (value.X > maxValue.Value || value.Y > maxValue))) { + string userData = UserData == null ? "null" : UserData.ToString(); string errorMsg = "Attempted to apply invalid " + valueName + - " to a physics body (userdata: " + UserData == null ? "null" : UserData.ToString() + + " to a physics body (userdata: " + userData + "), value: " + value + "\n" + Environment.StackTrace; DebugConsole.ThrowError(errorMsg); GameAnalyticsManager.AddErrorEventOnce( - "PhysicsBody.SetPosition:InvalidPosition", + "PhysicsBody.SetPosition:InvalidPosition" + userData, GameAnalyticsSDK.Net.EGAErrorSeverity.Error, errorMsg); return false; @@ -405,7 +418,7 @@ namespace Barotrauma public void ApplyLinearImpulse(Vector2 impulse) { - if (!IsValidValue(impulse, "impulse")) return; + if (!IsValidValue(impulse, "impulse", -1e10f, 1e10f)) return; body.ApplyLinearImpulse(impulse); } @@ -414,7 +427,7 @@ namespace Barotrauma /// public void ApplyLinearImpulse(Vector2 impulse, float maxVelocity) { - if (!IsValidValue(impulse, "impulse")) return; + if (!IsValidValue(impulse, "impulse", -1e10f, 1e10f)) return; if (!IsValidValue(maxVelocity, "max velocity")) return; float currSpeed = body.LinearVelocity.Length(); @@ -427,19 +440,19 @@ namespace Barotrauma public void ApplyLinearImpulse(Vector2 impulse, Vector2 point) { - if (!IsValidValue(impulse, "impulse")) return; + if (!IsValidValue(impulse, "impulse", -1e10f, 1e10f)) return; body.ApplyLinearImpulse(impulse, point); } public void ApplyForce(Vector2 force) { - if (!IsValidValue(force, "force")) return; + if (!IsValidValue(force, "force", -1e10f, 1e10f)) return; body.ApplyForce(force); } public void ApplyForce(Vector2 force, Vector2 point) { - if (!IsValidValue(force, "force")) return; + if (!IsValidValue(force, "force", -1e10f, 1e10f)) return; if (!IsValidValue(point, "point")) return; body.ApplyForce(force, point); } @@ -456,7 +469,7 @@ namespace Barotrauma System.Diagnostics.Debug.Assert(Math.Abs(simPosition.X) < 1000000.0f); System.Diagnostics.Debug.Assert(Math.Abs(simPosition.Y) < 1000000.0f); - if (!IsValidValue(simPosition, "position")) return; + if (!IsValidValue(simPosition, "position", -1e10f, 1e10f)) return; if (!IsValidValue(rotation, "rotation")) return; body.SetTransform(simPosition, rotation); @@ -469,7 +482,7 @@ namespace Barotrauma System.Diagnostics.Debug.Assert(Math.Abs(simPosition.X) < 1000000.0f); System.Diagnostics.Debug.Assert(Math.Abs(simPosition.Y) < 1000000.0f); - if (!IsValidValue(simPosition, "position")) return; + if (!IsValidValue(simPosition, "position", -1e10f, 1e10f)) return; if (!IsValidValue(rotation, "rotation")) return; body.SetTransformIgnoreContacts(ref simPosition, rotation); @@ -478,7 +491,7 @@ namespace Barotrauma public void SetPrevTransform(Vector2 simPosition, float rotation) { - if (!IsValidValue(simPosition, "position")) return; + if (!IsValidValue(simPosition, "position", -1e10f, 1e10f)) return; if (!IsValidValue(rotation, "rotation")) return; prevPosition = simPosition; @@ -504,7 +517,7 @@ namespace Barotrauma { if (pullPos == null) pullPos = body.Position; - if (!IsValidValue(simPosition, "position")) return; + if (!IsValidValue(simPosition, "position", -1e10f, 1e10f)) return; if (!IsValidValue(force, "force")) return; Vector2 vel = body.LinearVelocity;