[C#] Fix union verifier (#8593)

* [C#] Add test verifying unions

* [C#] Fix verifying unions

---------

Co-authored-by: Björn Harrtell <bjornharrtell@users.noreply.github.com>
Co-authored-by: Wouter van Oortmerssen <aardappel@gmail.com>
This commit is contained in:
TorsteinTenstadNorsonic
2025-08-29 01:05:42 +02:00
committed by GitHub
parent deb3d93454
commit 35230bd70c
2 changed files with 32 additions and 2 deletions

View File

@@ -684,10 +684,10 @@ namespace Google.FlatBuffers
{
return false;
}
// Check union data
offset = GetVOffset(tablePos, valueVOffset);
// Take type id
var typeId = verifier_buffer.Get(Convert.ToInt32(offset));
// Check union data
offset = GetVOffset(tablePos, valueVOffset);
if (offset == 0)
{
// When value data is not present, allow union verification function to deal with illegal offset

View File

@@ -1194,5 +1194,35 @@ namespace Google.FlatBuffers.Test
Assert.AreEqual(monster.ScalarKeySortedTablesByKey(i).Value.Count, i);
}
}
[FlatBuffersTestMethod]
public void TestVerifyingUnions()
{
var fbb = new FlatBufferBuilder(1);
var name_inner = fbb.CreateString("inner");
var name_outer = fbb.CreateString("outer");
Monster.StartMonster(fbb);
Monster.AddName(fbb, name_inner);
var monster_inner = Monster.EndMonster(fbb);
Monster.StartMonster(fbb);
Monster.AddName(fbb, name_outer);
Monster.AddTest(fbb, monster_inner.Value);
Monster.AddTestType(fbb, Any.Monster);
var monster_outer = Monster.EndMonster(fbb);
fbb.Finish(monster_outer.Value);
var bytes = fbb.SizedByteArray();
var bytes_to_corrupt_inner_name = fbb.SizedByteArray();
var bytes_to_corrupt_outer_name = fbb.SizedByteArray();
bytes_to_corrupt_inner_name[bytes.Length - name_inner.Value] = 0xFF;
bytes_to_corrupt_outer_name[bytes.Length - name_outer.Value] = 0xFF;
var valid = Monster.VerifyMonster(new ByteBuffer(bytes));
var valid_after_inner_corrupt = Monster.VerifyMonster(new ByteBuffer(bytes_to_corrupt_inner_name));
var valid_after_outer_corrupt = Monster.VerifyMonster(new ByteBuffer(bytes_to_corrupt_outer_name));
Assert.IsTrue(valid);
Assert.IsFalse(valid_after_inner_corrupt);
Assert.IsFalse(valid_after_outer_corrupt);
}
}
}