mirror of
https://github.com/google/flatbuffers.git
synced 2026-06-02 04:04:19 +00:00
[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:
committed by
GitHub
parent
deb3d93454
commit
35230bd70c
@@ -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
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user