From 1a2275b7f6704298fa386fa416c91bb09f0368bf Mon Sep 17 00:00:00 2001 From: Steve Gilham Date: Wed, 14 Oct 2020 14:55:34 +0100 Subject: [PATCH 1/6] Provoke the issue --- Mono.Cecil.sln | 6 ++++++ repro/Cecil.11.3.issue.csproj | 31 +++++++++++++++++++++++++++++ repro/Program.cs | 36 ++++++++++++++++++++++++++++++++++ repro/Sample3.dll | Bin 0 -> 6656 bytes repro/Sample3.dll.mdb | Bin 0 -> 1233 bytes 5 files changed, 73 insertions(+) create mode 100644 repro/Cecil.11.3.issue.csproj create mode 100644 repro/Program.cs create mode 100644 repro/Sample3.dll create mode 100644 repro/Sample3.dll.mdb diff --git a/Mono.Cecil.sln b/Mono.Cecil.sln index 7b3ff986c..2d2689245 100644 --- a/Mono.Cecil.sln +++ b/Mono.Cecil.sln @@ -19,6 +19,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Mono.Cecil.Rocks", "rocks\M EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Mono.Cecil.Rocks.Tests", "rocks\Test\Mono.Cecil.Rocks.Tests.csproj", "{EF768F7A-3C08-45EE-8A7E-BB5A81BADB7B}" EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Cecil.11.3.issue", "repro\Cecil.11.3.issue.csproj", "{BC2C29E7-BE9E-4087-9F7E-D9BCAFCA635E}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -57,6 +59,10 @@ Global {EF768F7A-3C08-45EE-8A7E-BB5A81BADB7B}.Debug|Any CPU.Build.0 = Debug|Any CPU {EF768F7A-3C08-45EE-8A7E-BB5A81BADB7B}.Release|Any CPU.ActiveCfg = Release|Any CPU {EF768F7A-3C08-45EE-8A7E-BB5A81BADB7B}.Release|Any CPU.Build.0 = Release|Any CPU + {BC2C29E7-BE9E-4087-9F7E-D9BCAFCA635E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {BC2C29E7-BE9E-4087-9F7E-D9BCAFCA635E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {BC2C29E7-BE9E-4087-9F7E-D9BCAFCA635E}.Release|Any CPU.ActiveCfg = Release|Any CPU + {BC2C29E7-BE9E-4087-9F7E-D9BCAFCA635E}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/repro/Cecil.11.3.issue.csproj b/repro/Cecil.11.3.issue.csproj new file mode 100644 index 000000000..feb38191f --- /dev/null +++ b/repro/Cecil.11.3.issue.csproj @@ -0,0 +1,31 @@ + + + + Exe + netcoreapp2.0 + Issue + + + + + + + + + + + + + + + + + + + PreserveNewest + + + PreserveNewest + + + \ No newline at end of file diff --git a/repro/Program.cs b/repro/Program.cs new file mode 100644 index 000000000..cb39a0ac1 --- /dev/null +++ b/repro/Program.cs @@ -0,0 +1,36 @@ +using System.IO; +using System.Linq; +using System.Reflection; +using Mono.Cecil; +using Mono.Cecil.Cil; +using Mono.Cecil.Mdb; + +public class Issue +{ + private static void Main(string[] args) + { + var here = Assembly.GetExecutingAssembly().Location; + var target = Path.Combine( + Path.GetDirectoryName(here), + "Sample3.dll" + ); + + var definition = AssemblyDefinition.ReadAssembly(target); + + var provider = new MdbReaderProvider(); + var reader = provider.GetSymbolReader(definition.MainModule, target); + definition.MainModule.ReadSymbols(reader); + + var pathGetterDef = + definition.MainModule.GetTypes(). + SelectMany(t => t.Methods). + First(m => m.Name.Equals("get_Defer")); + + var body = pathGetterDef.Body; + var worker = body.GetILProcessor(); + var initialBody = body.Instructions.ToList(); + var head = initialBody.First(); + var opcode = worker.Create(OpCodes.Ldc_I4_1); + worker.InsertBefore(head, opcode); + } +} \ No newline at end of file diff --git a/repro/Sample3.dll b/repro/Sample3.dll new file mode 100644 index 0000000000000000000000000000000000000000..6310d6c2df2ac9c33d1e2bb3398495c9606df840 GIT binary patch literal 6656 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 I|FHu90<5!B_5c6? literal 0 HcmV?d00001 diff --git a/repro/Sample3.dll.mdb b/repro/Sample3.dll.mdb new file mode 100644 index 0000000000000000000000000000000000000000..862bd59a9353d4908bf53114ce38c20fafb588a8 GIT binary patch literal 1233 zcmZ{kT}TvB7>2*^oSD(hCfi-t|A;bIvy55`NsGc&it4H;yx1tU4T>$p(dZ^p>4zZb z#|q54Dt{0vx~a5o%B!Gq?H3}mf=CU@te}Y6-ZMMk-gMZP=RNOy=ghaWb2hE((4Rd2 zXjOpXlYr_lFxon`-v#i-b!; z!AOl|Em>4&ZSUH
YUhMN-=&srL~+p}Ujhx6OR`4_84qc`;6Lc1s2f|&=IqCCX* z9o2k<=`FvTntx%M;IC8j7*n%o5q7JXw_euf$ zSt)xf0wvhfW#+hD{79$A`XH`h`7WgPQ}n!+Bv-IE$Fr_nJQXs9a{?tYS?D&C9L{v; z^Y{-H_P`wnLg9SV>*4-e>%M_RNo Date: Wed, 14 Oct 2020 15:54:37 +0100 Subject: [PATCH 2/6] Minimum fix (cherry picked from commit 0f23047c62027e10206a5d0dbb81cba6f2dc260f) --- Mono.Cecil.Cil/MethodBody.cs | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/Mono.Cecil.Cil/MethodBody.cs b/Mono.Cecil.Cil/MethodBody.cs index d970a0195..1526b5973 100644 --- a/Mono.Cecil.Cil/MethodBody.cs +++ b/Mono.Cecil.Cil/MethodBody.cs @@ -401,7 +401,15 @@ InstructionOffset ResolveInstructionOffset(InstructionOffset inputOffset, ref In for (int i = cache.Index; i < items.Length; i++) { cache.Index = i; cache.Offset = size; - cache.Instruction = items [i]; + + var item = items [i]; + + // Allow for trailing null values in the case of + // instructions.Size < instructions.Capacity + if (item == null) + break; + + cache.Instruction = item; if (cache.Offset == offset) return new InstructionOffset (cache.Instruction); @@ -409,7 +417,7 @@ InstructionOffset ResolveInstructionOffset(InstructionOffset inputOffset, ref In if (cache.Offset > offset) return new InstructionOffset (items [i - 1]); - size += items [i].GetSize (); + size += item.GetSize (); } return new InstructionOffset (); From 518458ad34411193bb70017c27a528d167cc2ae8 Mon Sep 17 00:00:00 2001 From: Steve Gilham Date: Wed, 14 Oct 2020 15:55:37 +0100 Subject: [PATCH 3/6] Revert "Provoke the issue" This reverts commit 1a2275b7f6704298fa386fa416c91bb09f0368bf. --- Mono.Cecil.sln | 6 ------ repro/Cecil.11.3.issue.csproj | 31 ----------------------------- repro/Program.cs | 36 ---------------------------------- repro/Sample3.dll | Bin 6656 -> 0 bytes repro/Sample3.dll.mdb | Bin 1233 -> 0 bytes 5 files changed, 73 deletions(-) delete mode 100644 repro/Cecil.11.3.issue.csproj delete mode 100644 repro/Program.cs delete mode 100644 repro/Sample3.dll delete mode 100644 repro/Sample3.dll.mdb diff --git a/Mono.Cecil.sln b/Mono.Cecil.sln index 2d2689245..7b3ff986c 100644 --- a/Mono.Cecil.sln +++ b/Mono.Cecil.sln @@ -19,8 +19,6 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Mono.Cecil.Rocks", "rocks\M EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Mono.Cecil.Rocks.Tests", "rocks\Test\Mono.Cecil.Rocks.Tests.csproj", "{EF768F7A-3C08-45EE-8A7E-BB5A81BADB7B}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Cecil.11.3.issue", "repro\Cecil.11.3.issue.csproj", "{BC2C29E7-BE9E-4087-9F7E-D9BCAFCA635E}" -EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -59,10 +57,6 @@ Global {EF768F7A-3C08-45EE-8A7E-BB5A81BADB7B}.Debug|Any CPU.Build.0 = Debug|Any CPU {EF768F7A-3C08-45EE-8A7E-BB5A81BADB7B}.Release|Any CPU.ActiveCfg = Release|Any CPU {EF768F7A-3C08-45EE-8A7E-BB5A81BADB7B}.Release|Any CPU.Build.0 = Release|Any CPU - {BC2C29E7-BE9E-4087-9F7E-D9BCAFCA635E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {BC2C29E7-BE9E-4087-9F7E-D9BCAFCA635E}.Debug|Any CPU.Build.0 = Debug|Any CPU - {BC2C29E7-BE9E-4087-9F7E-D9BCAFCA635E}.Release|Any CPU.ActiveCfg = Release|Any CPU - {BC2C29E7-BE9E-4087-9F7E-D9BCAFCA635E}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/repro/Cecil.11.3.issue.csproj b/repro/Cecil.11.3.issue.csproj deleted file mode 100644 index feb38191f..000000000 --- a/repro/Cecil.11.3.issue.csproj +++ /dev/null @@ -1,31 +0,0 @@ - - - - Exe - netcoreapp2.0 - Issue - - - - - - - - - - - - - - - - - - - PreserveNewest - - - PreserveNewest - - - \ No newline at end of file diff --git a/repro/Program.cs b/repro/Program.cs deleted file mode 100644 index cb39a0ac1..000000000 --- a/repro/Program.cs +++ /dev/null @@ -1,36 +0,0 @@ -using System.IO; -using System.Linq; -using System.Reflection; -using Mono.Cecil; -using Mono.Cecil.Cil; -using Mono.Cecil.Mdb; - -public class Issue -{ - private static void Main(string[] args) - { - var here = Assembly.GetExecutingAssembly().Location; - var target = Path.Combine( - Path.GetDirectoryName(here), - "Sample3.dll" - ); - - var definition = AssemblyDefinition.ReadAssembly(target); - - var provider = new MdbReaderProvider(); - var reader = provider.GetSymbolReader(definition.MainModule, target); - definition.MainModule.ReadSymbols(reader); - - var pathGetterDef = - definition.MainModule.GetTypes(). - SelectMany(t => t.Methods). - First(m => m.Name.Equals("get_Defer")); - - var body = pathGetterDef.Body; - var worker = body.GetILProcessor(); - var initialBody = body.Instructions.ToList(); - var head = initialBody.First(); - var opcode = worker.Create(OpCodes.Ldc_I4_1); - worker.InsertBefore(head, opcode); - } -} \ No newline at end of file diff --git a/repro/Sample3.dll b/repro/Sample3.dll deleted file mode 100644 index 6310d6c2df2ac9c33d1e2bb3398495c9606df840..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6656 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 I|FHu90<5!B_5c6? diff --git a/repro/Sample3.dll.mdb b/repro/Sample3.dll.mdb deleted file mode 100644 index 862bd59a9353d4908bf53114ce38c20fafb588a8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1233 zcmZ{kT}TvB7>2*^oSD(hCfi-t|A;bIvy55`NsGc&it4H;yx1tU4T>$p(dZ^p>4zZb z#|q54Dt{0vx~a5o%B!Gq?H3}mf=CU@te}Y6-ZMMk-gMZP=RNOy=ghaWb2hE((4Rd2 zXjOpXlYr_lFxon`-v#i-b!; z!AOl|Em>4&ZSUH
YUhMN-=&srL~+p}Ujhx6OR`4_84qc`;6Lc1s2f|&=IqCCX* z9o2k<=`FvTntx%M;IC8j7*n%o5q7JXw_euf$ zSt)xf0wvhfW#+hD{79$A`XH`h`7WgPQ}n!+Bv-IE$Fr_nJQXs9a{?tYS?D&C9L{v; z^Y{-H_P`wnLg9SV>*4-e>%M_RNo Date: Thu, 15 Oct 2020 10:04:31 +0100 Subject: [PATCH 4/6] Add unit test (cherry picked from commit 185ba884111e30cfb84aeb64f00324d995cfdd35) --- Test/Mono.Cecil.Tests/ILProcessorTests.cs | 31 +++++++++++++++++++++ Test/Resources/assemblies/Issue697.dll | Bin 0 -> 6656 bytes Test/Resources/assemblies/Issue697.dll.mdb | Bin 0 -> 1233 bytes 3 files changed, 31 insertions(+) create mode 100644 Test/Resources/assemblies/Issue697.dll create mode 100644 Test/Resources/assemblies/Issue697.dll.mdb diff --git a/Test/Mono.Cecil.Tests/ILProcessorTests.cs b/Test/Mono.Cecil.Tests/ILProcessorTests.cs index 88366152d..f94e5962b 100644 --- a/Test/Mono.Cecil.Tests/ILProcessorTests.cs +++ b/Test/Mono.Cecil.Tests/ILProcessorTests.cs @@ -40,6 +40,37 @@ public void InsertBefore () AssertOpCodeSequence (new [] { OpCodes.Ldloc_0, OpCodes.Ldloc_1, OpCodes.Ldloc_2, OpCodes.Ldloc_3 }, method); } + [Test] + public void InsertBeforeIssue697 () + { + var here = System.Reflection.Assembly.GetExecutingAssembly ().Location; + var target = Path.Combine ( + Path.GetDirectoryName (here), + "../../../Resources/assemblies/Issue697.dll" + ); + + var definition = AssemblyDefinition.ReadAssembly (target); + + var provider = new Cecil.Mdb.MdbReaderProvider (); + var reader = provider.GetSymbolReader (definition.MainModule, target); + definition.MainModule.ReadSymbols (reader); + + var pathGetterDef = + definition.MainModule.GetTypes (). + SelectMany (t => t.Methods). + First (m => m.Name.Equals ("get_Defer")); + + var body = pathGetterDef.Body; + var worker = body.GetILProcessor (); + var initialBody = body.Instructions.ToList (); + var head = initialBody.First (); + var opcode = worker.Create (OpCodes.Ldc_I4_1); + worker.InsertBefore (head, opcode); + worker.InsertBefore (head, worker.Create (OpCodes.Ret)); + initialBody.ForEach (worker.Remove); + AssertOpCodeSequence (new [] { OpCodes.Ldc_I4_1, OpCodes.Ret }, pathGetterDef.body); + } + [Test] public void InsertAfter () { diff --git a/Test/Resources/assemblies/Issue697.dll b/Test/Resources/assemblies/Issue697.dll new file mode 100644 index 0000000000000000000000000000000000000000..6310d6c2df2ac9c33d1e2bb3398495c9606df840 GIT binary patch literal 6656 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 I|FHu90<5!B_5c6? literal 0 HcmV?d00001 diff --git a/Test/Resources/assemblies/Issue697.dll.mdb b/Test/Resources/assemblies/Issue697.dll.mdb new file mode 100644 index 0000000000000000000000000000000000000000..862bd59a9353d4908bf53114ce38c20fafb588a8 GIT binary patch literal 1233 zcmZ{kT}TvB7>2*^oSD(hCfi-t|A;bIvy55`NsGc&it4H;yx1tU4T>$p(dZ^p>4zZb z#|q54Dt{0vx~a5o%B!Gq?H3}mf=CU@te}Y6-ZMMk-gMZP=RNOy=ghaWb2hE((4Rd2 zXjOpXlYr_lFxon`-v#i-b!; z!AOl|Em>4&ZSUH
YUhMN-=&srL~+p}Ujhx6OR`4_84qc`;6Lc1s2f|&=IqCCX* z9o2k<=`FvTntx%M;IC8j7*n%o5q7JXw_euf$ zSt)xf0wvhfW#+hD{79$A`XH`h`7WgPQ}n!+Bv-IE$Fr_nJQXs9a{?tYS?D&C9L{v; z^Y{-H_P`wnLg9SV>*4-e>%M_RNo Date: Thu, 15 Oct 2020 09:40:15 -0700 Subject: [PATCH 5/6] Use existing infrastructure --- Test/Mono.Cecil.Tests/ILProcessorTests.cs | 44 ++++++++++------------- 1 file changed, 18 insertions(+), 26 deletions(-) diff --git a/Test/Mono.Cecil.Tests/ILProcessorTests.cs b/Test/Mono.Cecil.Tests/ILProcessorTests.cs index f94e5962b..d49224011 100644 --- a/Test/Mono.Cecil.Tests/ILProcessorTests.cs +++ b/Test/Mono.Cecil.Tests/ILProcessorTests.cs @@ -5,6 +5,7 @@ using Mono.Cecil; using Mono.Cecil.Cil; +using Mono.Cecil.Mdb; using Mono.Cecil.Pdb; using NUnit.Framework; @@ -43,32 +44,23 @@ public void InsertBefore () [Test] public void InsertBeforeIssue697 () { - var here = System.Reflection.Assembly.GetExecutingAssembly ().Location; - var target = Path.Combine ( - Path.GetDirectoryName (here), - "../../../Resources/assemblies/Issue697.dll" - ); - - var definition = AssemblyDefinition.ReadAssembly (target); - - var provider = new Cecil.Mdb.MdbReaderProvider (); - var reader = provider.GetSymbolReader (definition.MainModule, target); - definition.MainModule.ReadSymbols (reader); - - var pathGetterDef = - definition.MainModule.GetTypes (). - SelectMany (t => t.Methods). - First (m => m.Name.Equals ("get_Defer")); - - var body = pathGetterDef.Body; - var worker = body.GetILProcessor (); - var initialBody = body.Instructions.ToList (); - var head = initialBody.First (); - var opcode = worker.Create (OpCodes.Ldc_I4_1); - worker.InsertBefore (head, opcode); - worker.InsertBefore (head, worker.Create (OpCodes.Ret)); - initialBody.ForEach (worker.Remove); - AssertOpCodeSequence (new [] { OpCodes.Ldc_I4_1, OpCodes.Ret }, pathGetterDef.body); + var parameters = new ReaderParameters { SymbolReaderProvider = new MdbReaderProvider () }; + using (var module = GetResourceModule ("Issue697.dll", parameters)) + { + var pathGetterDef = module.MainModule.GetTypes () + .SelectMany (t => t.Methods) + .First (m => m.Name.Equals ("get_Defer")); + + var body = pathGetterDef.Body; + var worker = body.GetILProcessor (); + var initialBody = body.Instructions.ToList (); + var head = initialBody.First (); + var opcode = worker.Create (OpCodes.Ldc_I4_1); + worker.InsertBefore (head, opcode); + worker.InsertBefore (head, worker.Create (OpCodes.Ret)); + initialBody.ForEach (worker.Remove); + AssertOpCodeSequence (new [] { OpCodes.Ldc_I4_1, OpCodes.Ret }, pathGetterDef.body); + } } [Test] From e71b672da1a4f34ffab6a9c586818d14e4ef1ef2 Mon Sep 17 00:00:00 2001 From: Jb Evain Date: Thu, 15 Oct 2020 09:47:29 -0700 Subject: [PATCH 6/6] Quick fix --- Test/Mono.Cecil.Tests/ILProcessorTests.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Test/Mono.Cecil.Tests/ILProcessorTests.cs b/Test/Mono.Cecil.Tests/ILProcessorTests.cs index d49224011..4eecfe3ff 100644 --- a/Test/Mono.Cecil.Tests/ILProcessorTests.cs +++ b/Test/Mono.Cecil.Tests/ILProcessorTests.cs @@ -47,7 +47,7 @@ public void InsertBeforeIssue697 () var parameters = new ReaderParameters { SymbolReaderProvider = new MdbReaderProvider () }; using (var module = GetResourceModule ("Issue697.dll", parameters)) { - var pathGetterDef = module.MainModule.GetTypes () + var pathGetterDef = module.GetTypes () .SelectMany (t => t.Methods) .First (m => m.Name.Equals ("get_Defer"));