diff options
author | Jb Evain <jbevain@gmail.com> | 2015-06-08 18:01:54 +0300 |
---|---|---|
committer | Jb Evain <jbevain@gmail.com> | 2015-06-08 18:01:54 +0300 |
commit | 51d55cb3e9228638382eefdb4c8a633e2249569e (patch) | |
tree | 4aff94f7155f6677250a27ddf6b3d788e1eb7170 | |
parent | 25635277869cf34c1dc79f6c8f045b0a42ce58b5 (diff) |
Protect against wrongly constructed versions
Test by @gluck.
Fix #227.
-rw-r--r-- | Mono.Cecil/AssemblyNameReference.cs | 18 | ||||
-rw-r--r-- | 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); + } } } |