mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
merge revision(s) 97426e15d7: [Backport #18627]
[Bug #18627] Fix crash when including module During lazy sweeping, the iclass could be a dead object that has not yet been swept. However, the chain of superclasses of the iclass could already have been swept (and become a new object), which would cause a crash when trying to read the object. --- class.c | 48 ++++++++++++++++++++++++++++++------------------ 1 file changed, 30 insertions(+), 18 deletions(-)
This commit is contained in:
parent
f404b21f84
commit
e0146e6cc8
2 changed files with 30 additions and 20 deletions
46
class.c
46
class.c
|
|
@ -973,17 +973,22 @@ rb_include_module(VALUE klass, VALUE module)
|
|||
int do_include = 1;
|
||||
while (iclass) {
|
||||
VALUE check_class = iclass->klass;
|
||||
while (check_class) {
|
||||
if (RB_TYPE_P(check_class, T_ICLASS) &&
|
||||
(RBASIC(check_class)->klass == module)) {
|
||||
do_include = 0;
|
||||
/* During lazy sweeping, iclass->klass could be a dead object that
|
||||
* has not yet been swept. */
|
||||
if (!rb_objspace_garbage_object_p(check_class)) {
|
||||
while (check_class) {
|
||||
if (RB_TYPE_P(check_class, T_ICLASS) &&
|
||||
(RBASIC(check_class)->klass == module)) {
|
||||
do_include = 0;
|
||||
}
|
||||
check_class = RCLASS_SUPER(check_class);
|
||||
}
|
||||
|
||||
if (do_include) {
|
||||
include_modules_at(iclass->klass, RCLASS_ORIGIN(iclass->klass), module, TRUE);
|
||||
}
|
||||
check_class = RCLASS_SUPER(check_class);
|
||||
}
|
||||
|
||||
if (do_include) {
|
||||
include_modules_at(iclass->klass, RCLASS_ORIGIN(iclass->klass), module, TRUE);
|
||||
}
|
||||
iclass = iclass->next;
|
||||
}
|
||||
}
|
||||
|
|
@ -1180,17 +1185,22 @@ rb_prepend_module(VALUE klass, VALUE module)
|
|||
struct rb_id_table *klass_m_tbl = RCLASS_M_TBL(klass);
|
||||
struct rb_id_table *klass_origin_m_tbl = RCLASS_M_TBL(klass_origin);
|
||||
while (iclass) {
|
||||
if (klass_had_no_origin && klass_origin_m_tbl == RCLASS_M_TBL(iclass->klass)) {
|
||||
// backfill an origin iclass to handle refinements and future prepends
|
||||
rb_id_table_foreach(RCLASS_M_TBL(iclass->klass), clear_module_cache_i, (void *)iclass->klass);
|
||||
RCLASS_M_TBL(iclass->klass) = klass_m_tbl;
|
||||
VALUE origin = rb_include_class_new(klass_origin, RCLASS_SUPER(iclass->klass));
|
||||
RCLASS_SET_SUPER(iclass->klass, origin);
|
||||
RCLASS_SET_INCLUDER(origin, RCLASS_INCLUDER(iclass->klass));
|
||||
RCLASS_SET_ORIGIN(iclass->klass, origin);
|
||||
RICLASS_SET_ORIGIN_SHARED_MTBL(origin);
|
||||
/* During lazy sweeping, iclass->klass could be a dead object that
|
||||
* has not yet been swept. */
|
||||
if (!rb_objspace_garbage_object_p(iclass->klass)) {
|
||||
if (klass_had_no_origin && klass_origin_m_tbl == RCLASS_M_TBL(iclass->klass)) {
|
||||
// backfill an origin iclass to handle refinements and future prepends
|
||||
rb_id_table_foreach(RCLASS_M_TBL(iclass->klass), clear_module_cache_i, (void *)iclass->klass);
|
||||
RCLASS_M_TBL(iclass->klass) = klass_m_tbl;
|
||||
VALUE origin = rb_include_class_new(klass_origin, RCLASS_SUPER(iclass->klass));
|
||||
RCLASS_SET_SUPER(iclass->klass, origin);
|
||||
RCLASS_SET_INCLUDER(origin, RCLASS_INCLUDER(iclass->klass));
|
||||
RCLASS_SET_ORIGIN(iclass->klass, origin);
|
||||
RICLASS_SET_ORIGIN_SHARED_MTBL(origin);
|
||||
}
|
||||
include_modules_at(iclass->klass, iclass->klass, module, FALSE);
|
||||
}
|
||||
include_modules_at(iclass->klass, iclass->klass, module, FALSE);
|
||||
|
||||
iclass = iclass->next;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -12,11 +12,11 @@
|
|||
# define RUBY_VERSION_MINOR RUBY_API_VERSION_MINOR
|
||||
#define RUBY_VERSION_TEENY 4
|
||||
#define RUBY_RELEASE_DATE RUBY_RELEASE_YEAR_STR"-"RUBY_RELEASE_MONTH_STR"-"RUBY_RELEASE_DAY_STR
|
||||
#define RUBY_PATCHLEVEL 197
|
||||
#define RUBY_PATCHLEVEL 198
|
||||
|
||||
#define RUBY_RELEASE_YEAR 2022
|
||||
#define RUBY_RELEASE_MONTH 3
|
||||
#define RUBY_RELEASE_DAY 13
|
||||
#define RUBY_RELEASE_DAY 21
|
||||
|
||||
#include "ruby/version.h"
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue