Skip to content

Commit 9fedae9

Browse files
committed
Add missing writebarrier to rb_func_proc_dup
Because TypedData_Make_Struct both allocates an object and after xmallocs memory, all added references must always be writebarrier protected.
1 parent d0d7f55 commit 9fedae9

File tree

1 file changed

+7
-4
lines changed

1 file changed

+7
-4
lines changed

proc.c

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -716,12 +716,15 @@ rb_func_proc_dup(VALUE src_obj)
716716
VALUE proc_obj = TypedData_Make_Struct(rb_obj_class(src_obj), cfunc_proc_t, &proc_data_type, proc);
717717

718718
memcpy(&proc->basic, src_proc, sizeof(rb_proc_t));
719+
RB_OBJ_WRITTEN(proc_obj, Qundef, proc->basic.block.as.captured.self);
720+
RB_OBJ_WRITTEN(proc_obj, Qundef, proc->basic.block.as.captured.code.val);
719721

722+
const VALUE *src_ep = src_proc->block.as.captured.ep;
720723
VALUE *ep = *(VALUE **)&proc->basic.block.as.captured.ep = proc->env + VM_ENV_DATA_SIZE - 1;
721-
ep[VM_ENV_DATA_INDEX_FLAGS] = src_proc->block.as.captured.ep[VM_ENV_DATA_INDEX_FLAGS];
722-
ep[VM_ENV_DATA_INDEX_ME_CREF] = src_proc->block.as.captured.ep[VM_ENV_DATA_INDEX_ME_CREF];
723-
ep[VM_ENV_DATA_INDEX_SPECVAL] = src_proc->block.as.captured.ep[VM_ENV_DATA_INDEX_SPECVAL];
724-
ep[VM_ENV_DATA_INDEX_ENV] = src_proc->block.as.captured.ep[VM_ENV_DATA_INDEX_ENV];
724+
ep[VM_ENV_DATA_INDEX_FLAGS] = src_ep[VM_ENV_DATA_INDEX_FLAGS];
725+
ep[VM_ENV_DATA_INDEX_ME_CREF] = src_ep[VM_ENV_DATA_INDEX_ME_CREF];
726+
ep[VM_ENV_DATA_INDEX_SPECVAL] = src_ep[VM_ENV_DATA_INDEX_SPECVAL];
727+
RB_OBJ_WRITE(proc_obj, &ep[VM_ENV_DATA_INDEX_ENV], src_ep[VM_ENV_DATA_INDEX_ENV]);
725728

726729
return proc_obj;
727730
}

0 commit comments

Comments
 (0)