From 8150a38dae6fbf60a8a5ffc20a1d07b911fbc31b Mon Sep 17 00:00:00 2001 From: Egor Bogatov Date: Tue, 3 Dec 2019 17:21:41 +0300 Subject: [PATCH] Don't throw NRE when len == 0 in Buffer.Memmove (#18004) --- mono/mini/intrinsics.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/mono/mini/intrinsics.c b/mono/mini/intrinsics.c index 2737b7f051f..b3de0568897 100644 --- a/mono/mini/intrinsics.c +++ b/mono/mini/intrinsics.c @@ -295,6 +295,13 @@ llvm_emit_inst_for_method (MonoCompile *cfg, MonoMethod *cmethod, MonoMethodSign if (in_corlib && !strcmp (m_class_get_name (cmethod->klass), "Buffer")) { if (!strcmp (cmethod->name, "Memmove") && fsig->param_count == 3 && fsig->params [0]->type == MONO_TYPE_PTR && fsig->params [1]->type == MONO_TYPE_PTR) { + MonoBasicBlock *end_bb; + NEW_BBLOCK (cfg, end_bb); + + // do nothing if len == 0 (even if src or dst are nulls) + MONO_EMIT_NEW_BIALU_IMM (cfg, OP_COMPARE_IMM, -1, args [2]->dreg, 0); + MONO_EMIT_NEW_BRANCH_BLOCK (cfg, OP_IBEQ, end_bb); + // throw NRE if src or dst are nulls MONO_EMIT_NEW_BIALU_IMM (cfg, OP_COMPARE_IMM, -1, args [0]->dreg, 0); MONO_EMIT_NEW_COND_EXC (cfg, EQ, "NullReferenceException"); @@ -306,6 +313,7 @@ llvm_emit_inst_for_method (MonoCompile *cfg, MonoMethod *cmethod, MonoMethodSign ins->sreg2 = args [1]->dreg; // i1* src ins->sreg3 = args [2]->dreg; // i32/i64 len MONO_ADD_INS (cfg->cbb, ins); + MONO_START_BB (cfg, end_bb); } } -- 2.11.4.GIT