Browse Source

Make ValidateConstructor safe

pull/2005/head
Siegfried Pammer 5 years ago
parent
commit
d457ef38f4
  1. 13
      ICSharpCode.Decompiler/IL/Transforms/TransformDisplayClassUsage.cs

13
ICSharpCode.Decompiler/IL/Transforms/TransformDisplayClassUsage.cs

@ -151,6 +151,7 @@ namespace ICSharpCode.Decompiler.IL.Transforms @@ -151,6 +151,7 @@ namespace ICSharpCode.Decompiler.IL.Transforms
var result = AnalyzeVariable(v);
if (result == null)
continue;
context.Step($"Detected display-class {v}", result.Initializer ?? f.Body);
displayClasses.Add(v, result);
}
}
@ -266,18 +267,19 @@ namespace ICSharpCode.Decompiler.IL.Transforms @@ -266,18 +267,19 @@ namespace ICSharpCode.Decompiler.IL.Transforms
private bool ValidateConstructor(IMethod method)
{
try {
if (method.Parameters.Count != 0)
return false;
var handle = (MethodDefinitionHandle)method.MetadataToken;
var module = (MetadataModule)method.ParentModule;
var file = module.PEFile;
if (handle.IsNil || file == null)
if (handle.IsNil || file != context.PEFile)
return false;
var def = file.Metadata.GetMethodDefinition(handle);
if (def.RelativeVirtualAddress == 0)
return false;
var body = file.Reader.GetMethodBody(def.RelativeVirtualAddress);
if (!body.LocalSignature.IsNil)
if (!body.LocalSignature.IsNil || body.ExceptionRegions.Length != 0)
return false;
var reader = body.GetILReader();
if (reader.Length != 7)
@ -295,9 +297,12 @@ namespace ICSharpCode.Decompiler.IL.Transforms @@ -295,9 +297,12 @@ namespace ICSharpCode.Decompiler.IL.Transforms
var objectCtor = module.ResolveMethod(baseCtorHandle, new TypeSystem.GenericContext());
if (!objectCtor.DeclaringType.IsKnownType(KnownTypeCode.Object))
return false;
if (objectCtor.Parameters.Count != 0)
if (!objectCtor.IsConstructor || objectCtor.Parameters.Count != 0)
return false;
return reader.DecodeOpCode() == ILOpCode.Ret;
} catch (BadImageFormatException) {
return false;
}
}
VariableToDeclare AddVariable(DisplayClass result, ILInstruction init, out IField field)
@ -333,6 +338,8 @@ namespace ICSharpCode.Decompiler.IL.Transforms @@ -333,6 +338,8 @@ namespace ICSharpCode.Decompiler.IL.Transforms
return declaredVar.CanPropagate;
}
return true;
case StLoc stloc:
return true;
default:
return false;
}

Loading…
Cancel
Save