mirror of
https://github.com/google/flatbuffers.git
synced 2026-06-29 14:02:00 +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;
|
return false;
|
||||||
}
|
}
|
||||||
// Check union data
|
|
||||||
offset = GetVOffset(tablePos, valueVOffset);
|
|
||||||
// Take type id
|
// Take type id
|
||||||
var typeId = verifier_buffer.Get(Convert.ToInt32(offset));
|
var typeId = verifier_buffer.Get(Convert.ToInt32(offset));
|
||||||
|
// Check union data
|
||||||
|
offset = GetVOffset(tablePos, valueVOffset);
|
||||||
if (offset == 0)
|
if (offset == 0)
|
||||||
{
|
{
|
||||||
// When value data is not present, allow union verification function to deal with illegal offset
|
// 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);
|
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