diff options
author | Andi McClure <andi.mcclure@xamarin.com> | 2015-12-03 01:17:38 +0300 |
---|---|---|
committer | Andi McClure <andi.mcclure@xamarin.com> | 2015-12-03 01:17:38 +0300 |
commit | 96b523de70179f1840c022f067c5509c222f2a05 (patch) | |
tree | 743c6d84073a82f2cddd746b8ccf48377dbe035a /mcs/class/Mono.Posix | |
parent | 4e4013721304d8da777f3137a9857e387c7cf548 (diff) | |
parent | 249ee0686bf87f33acf2efde76f3645ef06bb886 (diff) |
Merge pull request #2279 from xmcclure/mono-posix-version
Fail cleanly when MonoPosixHelper.dll version is wrong (bug #35655)
Diffstat (limited to 'mcs/class/Mono.Posix')
-rw-r--r-- | mcs/class/Mono.Posix/Mono.Unix.Native/Stdlib.cs | 36 | ||||
-rw-r--r-- | mcs/class/Mono.Posix/Mono.Unix/UnixSignal.cs | 5 |
2 files changed, 41 insertions, 0 deletions
diff --git a/mcs/class/Mono.Posix/Mono.Unix.Native/Stdlib.cs b/mcs/class/Mono.Posix/Mono.Unix.Native/Stdlib.cs index c2e50b8d259..e4c34cba317 100644 --- a/mcs/class/Mono.Posix/Mono.Unix.Native/Stdlib.cs +++ b/mcs/class/Mono.Posix/Mono.Unix.Native/Stdlib.cs @@ -381,6 +381,42 @@ namespace Mono.Unix.Native { internal const string LIBC = "msvcrt"; internal const string MPH = "MonoPosixHelper"; + // It is possible for Mono.Posix and MonoPosixHelper to get out of sync, + // for example if NuGet does something weird. To mitigate this, anyone + // editing Mono.Posix needs to observe two rules: + // 1. When introducing C-interface changes to MonoPosixHelper, update + // the version strings in VersionCheck below and also + // Mono_Unix_VersionString in the C sources. + // 2. Any class which performs a DllImport on Stdlib.MPH needs to call + // Stdlib.VersionCheck in its static constructor. + + [DllImport (Stdlib.MPH, CallingConvention=CallingConvention.Cdecl, + EntryPoint="Mono_Unix_VersionString")] + private static extern IntPtr VersionStringPtr (); + private static bool versionCheckPerformed = false; + internal static void VersionCheck () + { + if (versionCheckPerformed) + return; + + // This string is arbitrary; it matters only that it is unique. + string assemblyVersion = "MonoProject-2015-12-1"; + string nativeVersion = Marshal.PtrToStringAnsi (VersionStringPtr ()); + if (assemblyVersion != nativeVersion) + { + throw new Exception ("Mono.Posix assembly loaded with a different version (\"" + + assemblyVersion + "\") than MonoPosixHelper (\"" + nativeVersion + + "\"). You may need to reinstall Mono.Posix."); + } + + versionCheckPerformed = true; + } + + static Stdlib () + { + VersionCheck (); + } + internal Stdlib () {} #region <errno.h> Declarations diff --git a/mcs/class/Mono.Posix/Mono.Unix/UnixSignal.cs b/mcs/class/Mono.Posix/Mono.Unix/UnixSignal.cs index 883e044aea1..fe1f8beba8e 100644 --- a/mcs/class/Mono.Posix/Mono.Unix/UnixSignal.cs +++ b/mcs/class/Mono.Posix/Mono.Unix/UnixSignal.cs @@ -39,6 +39,11 @@ namespace Mono.Unix { private int signum; private IntPtr signal_info; + static UnixSignal () + { + Stdlib.VersionCheck (); + } + public UnixSignal (Signum signum) { this.signum = NativeConvert.FromSignum (signum); |