Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mono/mono.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndi McClure <andi.mcclure@xamarin.com>2015-12-03 01:17:38 +0300
committerAndi McClure <andi.mcclure@xamarin.com>2015-12-03 01:17:38 +0300
commit96b523de70179f1840c022f067c5509c222f2a05 (patch)
tree743c6d84073a82f2cddd746b8ccf48377dbe035a /mcs/class/Mono.Posix
parent4e4013721304d8da777f3137a9857e387c7cf548 (diff)
parent249ee0686bf87f33acf2efde76f3645ef06bb886 (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.cs36
-rw-r--r--mcs/class/Mono.Posix/Mono.Unix/UnixSignal.cs5
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);