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

Loading…
Cancel
Save