Properly compare assembly versions when performing binding. Fixes #17368.
authorRodrigo Kumpera <kumpera@gmail.com>
Mon, 27 Jan 2014 21:28:01 +0000 (16:28 -0500)
committerRodrigo Kumpera <kumpera@gmail.com>
Mon, 27 Jan 2014 21:28:01 +0000 (16:28 -0500)
The right way to compare assembly versions is by translating the major/minor
pair into a single number and compare that.

Since each element can only be one byte long, we multiply major by 256
before adding to minor.

This solves the problem where version 100.0.0.0 was not after 3.5.0.0.

mono/metadata/assembly.c

index 75e6665af6d01c815549187f759c471374950f33..a0703c9257b3bc7f2a7070eef1daec25784b42a9 100644 (file)
@@ -2562,16 +2562,23 @@ assembly_binding_info_parsed (MonoAssemblyBindingInfo *info, void *user_data)
        domain->assembly_bindings = g_slist_append_mempool (domain->mp, domain->assembly_bindings, info_copy);
 }
 
+static int
+get_version_number (int major, int minor)
+{
+       return major * 256 + minor;
+}
+
 static inline gboolean
 info_major_minor_in_range (MonoAssemblyBindingInfo *info, MonoAssemblyName *aname)
 {
+       int aname_version_number = get_version_number (aname->major, aname->minor);
        if (!info->has_old_version_bottom)
                return FALSE;
 
-       if (info->old_version_bottom.major > aname->major || info->old_version_bottom.minor > aname->minor)
+       if (get_version_number (info->old_version_bottom.major, info->old_version_bottom.minor) > aname_version_number)
                return FALSE;
 
-       if (info->has_old_version_top && (info->old_version_top.major < aname->major || info->old_version_top.minor < aname->minor))
+       if (info->has_old_version_top && get_version_number (info->old_version_top.major, info->old_version_top.minor) < aname_version_number)
                return FALSE;
 
        /* This is not the nicest way to do it, but it's a by-product of the way parsing is done */