From 51d55cb3e9228638382eefdb4c8a633e2249569e Mon Sep 17 00:00:00 2001 From: Jb Evain Date: Mon, 8 Jun 2015 17:01:54 +0200 Subject: Protect against wrongly constructed versions Test by @gluck. Fix #227. --- Mono.Cecil/AssemblyNameReference.cs | 18 ++++++++++++++++-- Test/Mono.Cecil.Tests/AssemblyTests.cs | 10 ++++++++++ 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/Mono.Cecil/AssemblyNameReference.cs b/Mono.Cecil/AssemblyNameReference.cs index a202e91..6521dc6 100644 --- a/Mono.Cecil/AssemblyNameReference.cs +++ b/Mono.Cecil/AssemblyNameReference.cs @@ -49,7 +49,7 @@ namespace Mono.Cecil { public Version Version { get { return version; } set { - version = value ?? Mixin.ZeroVersion; + version = Mixin.CheckVersion (value); full_name = null; } } @@ -239,7 +239,7 @@ namespace Mono.Cecil { throw new ArgumentNullException ("name"); this.name = name; - this.version = version ?? Mixin.ZeroVersion; + this.version = Mixin.CheckVersion (version); this.hash_algorithm = AssemblyHashAlgorithm.None; this.token = new MetadataToken (TokenType.AssemblyRef); } @@ -253,5 +253,19 @@ namespace Mono.Cecil { partial class Mixin { public static Version ZeroVersion = new Version (0, 0, 0 ,0); + + public static Version CheckVersion (Version version) + { + if (version == null) + return ZeroVersion; + + if (version.Build == -1) + return new Version (version.Major, version.Minor, 0, 0); + + if (version.Revision == -1) + return new Version (version.Major, version.Minor, version.Build, 0); + + return version; + } } } diff --git a/Test/Mono.Cecil.Tests/AssemblyTests.cs b/Test/Mono.Cecil.Tests/AssemblyTests.cs index e7af8d4..c7e5ef6 100644 --- a/Test/Mono.Cecil.Tests/AssemblyTests.cs +++ b/Test/Mono.Cecil.Tests/AssemblyTests.cs @@ -45,5 +45,15 @@ namespace Mono.Cecil.Tests { Assert.AreEqual ("0.0.0.0", name.Version.ToString (fieldCount: 4)); Assert.AreEqual ("Foo, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null", name.FullName); } + + [Test] + public void NoBuildOrMajor () + { + var name = new AssemblyNameReference ("Foo", new Version (0, 0)); + Assert.AreEqual ("Foo, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null", name.FullName); + + name = new AssemblyNameReference ("Foo", new Version (0, 0, 0)); + Assert.AreEqual ("Foo, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null", name.FullName); + } } } -- cgit v1.2.3