Skip to content
This repository was archived by the owner on Jan 18, 2022. It is now read-only.

Commit baf9136

Browse files
authored
Fix underflow memory allocation crash in transform sync. (#683)
* Fix underflow memory allocation crash in transform sync. Slight optimization to avoid dynamic buffer resizes.
1 parent c0ecc5c commit baf9136

File tree

2 files changed

+17
-14
lines changed

2 files changed

+17
-14
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
- Fixed a bug where you could start each built-out worker only once on OSX.
2626
- Code generation now captures nested package dependencies, so the generated schema contains schema components from all required packages. Previously, code generation only generated schema for top-level dependencies, skipping nested packages.
2727
- Fixed a bug where spaces in the path would cause code generation to fail on OSX.
28+
- Fixed an issue in the TransformSynchronization module where an integer underflow would cause a memory crash.
2829

2930
### Removed
3031

workers/unity/Packages/com.improbable.gdk.transformsynchronization/Systems/InterpolateTransformSystem.cs

Lines changed: 16 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ private struct Data
3838

3939
protected override void OnUpdate()
4040
{
41-
for (int i = 0; i < data.Length; ++i)
41+
for (var i = 0; i < data.Length; ++i)
4242
{
4343
var config = data.Config[i];
4444
var transformBuffer = data.TransformBuffer[i];
@@ -64,7 +64,7 @@ protected override void OnUpdate()
6464

6565
var transformToInterpolateTo = ToBufferedTransform(currentTransformComponent);
6666

67-
uint ticksToFill = math.max((uint) config.TargetBufferSize, 1);
67+
var ticksToFill = math.max((uint) config.TargetBufferSize, 1);
6868

6969
if (ticksToFill > 1)
7070
{
@@ -86,7 +86,7 @@ protected override void OnUpdate()
8686

8787
foreach (var update in data.Updates[i].Updates)
8888
{
89-
UpdateLastTransfrom(ref lastTransformApplied, update);
89+
UpdateLastTransform(ref lastTransformApplied, update);
9090
data.LastTransformValue[i] = new DeferredUpdateTransform
9191
{
9292
Transform = lastTransformApplied
@@ -100,28 +100,30 @@ protected override void OnUpdate()
100100
var transformToInterpolateTo = ToBufferedTransform(lastTransformApplied);
101101

102102
var transformToInterpolateFrom = transformBuffer[transformBuffer.Length - 1];
103-
uint lastTickId = transformToInterpolateFrom.PhysicsTick;
103+
var lastTickId = transformToInterpolateFrom.PhysicsTick;
104104

105-
uint remoteTickDifference = transformToInterpolateTo.PhysicsTick - lastTickId;
106-
if (remoteTickDifference == 0)
105+
if (transformToInterpolateTo.PhysicsTick <= lastTickId)
107106
{
108107
continue;
109108
}
110109

111-
uint ticksToFill =
112-
math.max((uint) (transformToInterpolateTo.PhysicsTick - lastTickId), 1);
113-
for (uint j = 0; j < ticksToFill - 1; ++j)
110+
var remoteTickDifference = (int) (transformToInterpolateTo.PhysicsTick - lastTickId);
111+
var bufferedTransforms = new NativeArray<BufferedTransform>(remoteTickDifference, Allocator.Temp,
112+
NativeArrayOptions.UninitializedMemory);
113+
for (var j = 0; j < remoteTickDifference - 1; ++j)
114114
{
115-
transformBuffer.Add(InterpolateValues(transformToInterpolateFrom, transformToInterpolateTo,
116-
j + 1));
115+
bufferedTransforms[j] = InterpolateValues(transformToInterpolateFrom, transformToInterpolateTo,
116+
(uint) j + 1);
117117
}
118118

119-
transformBuffer.Add(transformToInterpolateTo);
119+
bufferedTransforms[remoteTickDifference - 1] = transformToInterpolateTo;
120+
transformBuffer.AddRange(bufferedTransforms);
121+
bufferedTransforms.Dispose();
120122
}
121123
}
122124
}
123125

124-
private void UpdateLastTransfrom(ref TransformInternal.Component lastTransform, TransformInternal.Update update)
126+
private void UpdateLastTransform(ref TransformInternal.Component lastTransform, TransformInternal.Update update)
125127
{
126128
if (update.Location.HasValue)
127129
{
@@ -174,7 +176,7 @@ private static BufferedTransform ToBufferedTransformAtTick(TransformInternal.Com
174176
private static BufferedTransform InterpolateValues(BufferedTransform first, BufferedTransform second,
175177
uint ticksAfterFirst)
176178
{
177-
float t = (float) ticksAfterFirst / (float) (second.PhysicsTick - first.PhysicsTick);
179+
var t = (float) ticksAfterFirst / (float) (second.PhysicsTick - first.PhysicsTick);
178180
return new BufferedTransform
179181
{
180182
Position = Vector3.Lerp(first.Position, second.Position, t),

0 commit comments

Comments
 (0)