From c2f3f103bbda34f2906608be7c01ad0e885fd744 Mon Sep 17 00:00:00 2001 From: "Yukihiro \"Matz\" Matsumoto" Date: Wed, 24 May 2023 17:53:41 +0900 Subject: [PATCH] mruby-struct/struct.c (mrb_struct_ref): update the function - use `num_members` - ensure the function takes no argument - avoid out-of-bound access when struct is failed to initialize --- mrbgems/mruby-struct/src/struct.c | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/mrbgems/mruby-struct/src/struct.c b/mrbgems/mruby-struct/src/struct.c index 9834bfa9c..51c2c0eba 100644 --- a/mrbgems/mruby-struct/src/struct.c +++ b/mrbgems/mruby-struct/src/struct.c @@ -104,13 +104,25 @@ mrb_struct_members(mrb_state *mrb, mrb_value obj) return mrb_struct_s_members_m(mrb, mrb_obj_value(mrb_obj_class(mrb, obj))); } +static mrb_int +num_members(mrb_state *mrb, mrb_value self) +{ + mrb_value members = struct_members(mrb, self); + return RARRAY_LEN(members); +} + static mrb_value mrb_struct_ref(mrb_state *mrb, mrb_value obj) { + mrb_int argc = mrb_get_argc(mrb); + if (argc != 0) { + mrb_argnum_error(mrb, argc, 0, 0); + } mrb_int i = mrb_integer(mrb_proc_cfunc_env_get(mrb, 0)); + mrb_int len = num_members(mrb, obj); mrb_value *ptr = RSTRUCT_PTR(obj); - if (!ptr) return mrb_nil_value(); + if (!ptr || len <= i) return mrb_nil_value(); return ptr[i]; } @@ -289,13 +301,6 @@ mrb_struct_s_def(mrb_state *mrb, mrb_value klass) return st; } -static mrb_int -num_members(mrb_state *mrb, mrb_value self) -{ - mrb_value members = struct_members(mrb, self); - return RARRAY_LEN(members); -} - /* 15.2.18.4.8 */ /* */