Hi,

With the move to mono 5 and integration of .NET Core modules (corefx,
corert), mono has tightened the checks around some operations, leading
to exceptions in some software that was built based on previously
allowed operations.

The diff below adds an option to disable 2 of these checks, allowing
to run selected software again by setting the env var
MONO_FORCE_COMPAT.

This was found and tested with the 2 games Terraria and Sword of the
Stars: The Pit, by me stefmorino (on Freenode #openbsd-gaming), and
solene@.

My understanding of the reasons for the exceptions is that undefined
behavior could occur if these exceptions are disabled. Terraria and
Sword of the Stars: The Pit work fine with this workaround.
MONO_FORCE_COMPAT shoud only be set in such exceptions where the
assemblies fail to run otherwise. The use of mono should otherwise be
unaffected.

The Terraria part of this compatibility issue has been raised with
upstream, but the conversation is stalling [1].

ok to include this in mono?

[1] https://github.com/mono/corert/pull/33

Index: Makefile
===================================================================
RCS file: /cvs/ports/lang/mono/Makefile,v
retrieving revision 1.132
diff -u -p -r1.132 Makefile
--- Makefile    19 Sep 2019 12:02:59 -0000      1.132
+++ Makefile    3 Oct 2019 17:16:02 -0000
@@ -5,6 +5,7 @@ USE_WXNEEDED=   Yes
 COMMENT=       cross platform, open source .NET developement framework
 
 V=             5.20.1.34
+REVISION=      0
 
 DISTNAME=      mono-${V}
 
Index: 
patches/patch-external_corefx_src_Common_src_CoreLib_System_Collections_Generic_List_cs
===================================================================
RCS file: 
patches/patch-external_corefx_src_Common_src_CoreLib_System_Collections_Generic_List_cs
diff -N 
patches/patch-external_corefx_src_Common_src_CoreLib_System_Collections_Generic_List_cs
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ 
patches/patch-external_corefx_src_Common_src_CoreLib_System_Collections_Generic_List_cs
     3 Oct 2019 17:16:02 -0000
@@ -0,0 +1,24 @@
+$OpenBSD$
+
+add MONO_FORCE_COMPAT env var for backwards compatibility with some
+routines that were abandoned with the update to mono 5 upstream
+This may lead to undefined behavior and should only be used in
+well-defined cases.
+
+Index: 
external/corefx/src/Common/src/CoreLib/System/Collections/Generic/List.cs
+--- 
external/corefx/src/Common/src/CoreLib/System/Collections/Generic/List.cs.orig
++++ external/corefx/src/Common/src/CoreLib/System/Collections/Generic/List.cs
+@@ -578,8 +578,11 @@ namespace System.Collections.Generic
+                 action(_items[i]);
+             }
+ 
+-            if (version != _version)
+-                
ThrowHelper.ThrowInvalidOperationException_InvalidOperation_EnumFailedVersion();
++            if (Environment.GetEnvironmentVariable ("MONO_FORCE_COMPAT") == 
null)
++            {
++                if (version != _version)
++                    
ThrowHelper.ThrowInvalidOperationException_InvalidOperation_EnumFailedVersion();
++            }
+         }
+ 
+         // Returns an enumerator for this list with the given
Index: 
patches/patch-external_corert_src_System_Private_CoreLib_shared_System_Collections_Generic_ArraySortHelper_cs
===================================================================
RCS file: 
patches/patch-external_corert_src_System_Private_CoreLib_shared_System_Collections_Generic_ArraySortHelper_cs
diff -N 
patches/patch-external_corert_src_System_Private_CoreLib_shared_System_Collections_Generic_ArraySortHelper_cs
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ 
patches/patch-external_corert_src_System_Private_CoreLib_shared_System_Collections_Generic_ArraySortHelper_cs
       3 Oct 2019 17:16:02 -0000
@@ -0,0 +1,20 @@
+$OpenBSD$
+
+add MONO_FORCE_COMPAT env var for backwards compatibility with some
+routines that were abandoned with the update to mono 5 upstream
+This may lead to undefined behavior and should only be used in
+well-defined cases.
+
+Index: 
external/corert/src/System.Private.CoreLib/shared/System/Collections/Generic/ArraySortHelper.cs
+--- 
external/corert/src/System.Private.CoreLib/shared/System/Collections/Generic/ArraySortHelper.cs.orig
++++ 
external/corert/src/System.Private.CoreLib/shared/System/Collections/Generic/ArraySortHelper.cs
+@@ -40,7 +40,8 @@ namespace System.Collections.Generic
+ 
+         internal static void ThrowOrIgnoreBadComparer(object comparer)
+         {
+-            throw new ArgumentException(SR.Format(SR.Arg_BogusIComparer, 
comparer));
++            if (Environment.GetEnvironmentVariable ("MONO_FORCE_COMPAT") == 
null)
++                throw new ArgumentException(SR.Format(SR.Arg_BogusIComparer, 
comparer));
+         }
+     }
+ 

Reply via email to