[verifier] Base constructors can only be called on uninit'd this pointers. Fix #12157.
authorRodrigo Kumpera <kumpera@gmail.com>
Fri, 18 Aug 2017 22:00:45 +0000 (15:00 -0700)
committerRodrigo Kumpera <kumpera@gmail.com>
Fri, 18 Aug 2017 22:00:45 +0000 (15:00 -0700)
mono/metadata/verify.c

index 3677d9e4b7000a26e269aebc690e625978725d77..fa38edffc031b768aa6ef39b683e33ace1408eae 100644 (file)
@@ -3227,6 +3227,8 @@ do_invoke_method (VerifyContext *ctx, int method_token, gboolean virtual_)
                        value = stack_pop_safe (ctx);
                        if (IS_STRICT_MODE (ctx) && (value->stype & THIS_POINTER_MASK) != THIS_POINTER_MASK)
                                CODE_NOT_VERIFIABLE (ctx, g_strdup_printf ("Invalid 'this ptr' argument for constructor at 0x%04x", ctx->ip_offset));
+                       if (!(value->stype & UNINIT_THIS_MASK))
+                               CODE_NOT_VERIFIABLE (ctx, g_strdup_printf ("Calling the base constructor on an initialized this pointer at 0x%04x", ctx->ip_offset));
                } else {
                        value = stack_pop (ctx);
                }