[sre] use AssemblyBuilderAccess bitmask to set MonoDynamicImage flags
authorAleksey Kliger <aleksey@xamarin.com>
Thu, 29 Jun 2017 19:01:41 +0000 (15:01 -0400)
committerAleksey Kliger <aleksey@xamarin.com>
Fri, 30 Jun 2017 04:36:26 +0000 (00:36 -0400)
In particular this makes sure that AssemblyBuilderAccess.ReflectionOnly aren't
allowed to run.  And AssemblyBuilderAccess.CollectAndRun aren't allowed to save.

mono/metadata/sre.c

index 691804c4f051dc2d279814e3bb6e2d361759d811..d7427a6dd9506770782212ed8dd93c7bca4f9f88 100644 (file)
@@ -1204,6 +1204,25 @@ mono_image_create_token (MonoDynamicImage *assembly, MonoObjectHandle obj,
 
 #ifndef DISABLE_REFLECTION_EMIT
 
+static gboolean
+assemblybuilderaccess_can_refonlyload (guint32 access)
+{
+       return (access & 0x4) != 0;
+}
+
+static gboolean
+assemblybuilderaccess_can_run (guint32 access)
+{
+       return (access & MonoAssemblyBuilderAccess_Run) != 0;
+}
+
+static gboolean
+assemblybuilderaccess_can_save (guint32 access)
+{
+       return (access & MonoAssemblyBuilderAccess_Save) != 0;
+}
+
+
 /*
  * mono_reflection_dynimage_basic_init:
  * @assembly: an assembly builder object
@@ -1260,8 +1279,8 @@ mono_reflection_dynimage_basic_init (MonoReflectionAssemblyBuilder *assemblyb)
                        assembly->assembly.aname.revision = 0;
         }
 
-       assembly->run = assemblyb->access != 2;
-       assembly->save = assemblyb->access != 1;
+       assembly->run = assemblybuilderaccess_can_run (assemblyb->access);
+       assembly->save = assemblybuilderaccess_can_save (assemblyb->access);
        assembly->domain = domain;
 
        char *assembly_name = mono_string_to_utf8_checked (assemblyb->name, &error);