From 21f7cca2c6394aaaec9189a7cb08a9ad8a2196e3 Mon Sep 17 00:00:00 2001 From: Koichi Sasada Date: Sat, 9 Nov 2019 09:59:32 +0900 Subject: initialize kw special local var. A method which has keyword parameters has an implicit local variable to specify which keywords are (un)specified. vm_call_iseq_setup_kwparm_nokwarg() is special function to invoke a ISeq method without any keyword arguments. However, it should also initialize the special local var. Without this initialization, the implicit lvar can points a freed (T_NONE) object. --- vm_insnhelper.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) (limited to 'vm_insnhelper.c') diff --git a/vm_insnhelper.c b/vm_insnhelper.c index 890cbf6659..8378fc37b9 100644 --- a/vm_insnhelper.c +++ b/vm_insnhelper.c @@ -2073,9 +2073,12 @@ vm_call_iseq_setup_kwparm_nokwarg(rb_execution_context_t *ec, rb_control_frame_t VALUE * const argv = cfp->sp - calling->argc; VALUE * const klocals = argv + kw_param->bits_start - kw_param->num; - for (int i=0; inum; i++) { + int i; + for (i=0; inum; i++) { klocals[i] = kw_param->default_values[i]; } + klocals[i] = INT2FIX(0); // kw specify flag + /* NOTE: don't need to setup (clear) unspecified bits because no code check it. klocals[kw_param->num] = INT2FIX(0); */ -- cgit v1.2.1