From ede17f98c9dd9396f9b3f4079af166a784e4baac Mon Sep 17 00:00:00 2001 From: Jb Evain Date: Fri, 2 Jul 2021 14:08:04 -0700 Subject: Fix handling of empty string constants (#776) --- Mono.Cecil/AssemblyReader.cs | 4 +++- Test/Mono.Cecil.Tests/PortablePdbTests.cs | 17 +++++++++++++++++ Test/Resources/assemblies/empty-str-const.exe | Bin 0 -> 4096 bytes Test/Resources/assemblies/empty-str-const.pdb | Bin 0 -> 2668 bytes 4 files changed, 20 insertions(+), 1 deletion(-) create mode 100644 Test/Resources/assemblies/empty-str-const.exe create mode 100644 Test/Resources/assemblies/empty-str-const.pdb diff --git a/Mono.Cecil/AssemblyReader.cs b/Mono.Cecil/AssemblyReader.cs index 5cd3d17..b66c162 100644 --- a/Mono.Cecil/AssemblyReader.cs +++ b/Mono.Cecil/AssemblyReader.cs @@ -3005,7 +3005,9 @@ namespace Mono.Cecil { object value; if (type.etype == ElementType.String) { - if (signature.CanReadMore () && signature.buffer [signature.position] != 0xff) { + if (!signature.CanReadMore ()) + value = ""; + else if (signature.buffer [signature.position] != 0xff) { var bytes = signature.ReadBytes ((int) (signature.sig_length - (signature.position - signature.start))); value = Encoding.Unicode.GetString (bytes, 0, bytes.Length); } else diff --git a/Test/Mono.Cecil.Tests/PortablePdbTests.cs b/Test/Mono.Cecil.Tests/PortablePdbTests.cs index 43b8cfe..d9786cb 100644 --- a/Test/Mono.Cecil.Tests/PortablePdbTests.cs +++ b/Test/Mono.Cecil.Tests/PortablePdbTests.cs @@ -474,6 +474,23 @@ namespace Mono.Cecil.Tests { } } + [Test] + public void EmptyStringLocalConstant () + { + TestModule ("empty-str-const.exe", module => { + var type = module.GetType ("$"); + var method = type.GetMethod ("
$"); + var symbol = method.DebugInformation; + + Assert.IsNotNull (symbol); + Assert.AreEqual (1, symbol.Scope.Constants.Count); + + var a = symbol.Scope.Constants [0]; + Assert.AreEqual ("value", a.Name); + Assert.AreEqual ("", a.Value); + }, symbolReaderProvider: typeof (PortablePdbReaderProvider), symbolWriterProvider: typeof (PortablePdbWriterProvider)); + } + [Test] public void SourceLink () { diff --git a/Test/Resources/assemblies/empty-str-const.exe b/Test/Resources/assemblies/empty-str-const.exe new file mode 100644 index 0000000..6cc5128 Binary files /dev/null and b/Test/Resources/assemblies/empty-str-const.exe differ diff --git a/Test/Resources/assemblies/empty-str-const.pdb b/Test/Resources/assemblies/empty-str-const.pdb new file mode 100644 index 0000000..723ec4e Binary files /dev/null and b/Test/Resources/assemblies/empty-str-const.pdb differ -- cgit v1.2.3