Block explicit layout types in sandboxing.

This commit is contained in:
Pieter-Jan Briers
2022-04-16 14:17:22 +02:00
parent ec47229a37
commit f2fa930edd
2 changed files with 58 additions and 0 deletions

View File

@@ -193,6 +193,10 @@ namespace Robust.Shared.ContentPack
_sawmill.Debug($"Unmanaged methods... {fullStopwatch.ElapsedMilliseconds}ms");
CheckNoTypeAbuse(reader, errors);
_sawmill.Debug($"Type abuse... {fullStopwatch.ElapsedMilliseconds}ms");
CheckMemberReferences(loadedConfig, members, errors);
foreach (var error in errors)
@@ -311,6 +315,27 @@ namespace Robust.Shared.ContentPack
}
}
private static void CheckNoTypeAbuse(MetadataReader reader, ConcurrentBag<SandboxError> errors)
{
foreach (var typeDefHandle in reader.TypeDefinitions)
{
var typeDef = reader.GetTypeDefinition(typeDefHandle);
if ((typeDef.Attributes & TypeAttributes.ExplicitLayout) != 0)
{
// The C# compiler emits explicit layout types for some array init logic. These have no fields.
// Only ban explicit layout if it has fields.
var type = GetTypeFromDefinition(reader, typeDefHandle);
if (typeDef.GetFields().Count > 0)
{
var err = $"Explicit layout type {type} may not have fields.";
errors.Add(new SandboxError(err));
}
}
}
}
private void CheckMemberReferences(
SandboxConfig sandboxConfig,
List<MMemberRef> members,