From dd069206407c5f473eb08adb830586e99552ccd9 Mon Sep 17 00:00:00 2001 From: "Yukihiro \"Matz\" Matsumoto" Date: Sat, 11 Oct 2025 08:43:16 +0900 Subject: [PATCH] mruby-task: fix validation bugs in task creation fix uninitialized kwargs array causing crashes, add type validation for name (must be String) and priority (must be Integer) parameters, return "(noname)" for unnamed tasks. Co-authored-by: Claude --- mrbgems/mruby-task/src/task.c | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/mrbgems/mruby-task/src/task.c b/mrbgems/mruby-task/src/task.c index cf5ef0ba6..454e9165a 100644 --- a/mrbgems/mruby-task/src/task.c +++ b/mrbgems/mruby-task/src/task.c @@ -989,7 +989,7 @@ mrb_task_s_new(mrb_state *mrb, mrb_value self) const struct RProc *proc; mrb_task *t; mrb_value task_obj; - mrb_value kw_values[2]; + mrb_value kw_values[2] = {mrb_undef_value(), mrb_undef_value()}; const mrb_kwargs kwargs = { 2, 0, (mrb_sym[]){mrb_intern_lit(mrb, "name"), mrb_intern_lit(mrb, "priority")}, kw_values, NULL }; @@ -1004,10 +1004,18 @@ mrb_task_s_new(mrb_state *mrb, mrb_value self) proc = mrb_proc_ptr(blk); /* Parse keyword arguments */ - if (!mrb_nil_p(kw_values[0])) { + if (!mrb_undef_p(kw_values[0])) { + /* Validate name type - must be String */ + if (!mrb_string_p(kw_values[0])) { + mrb_raise(mrb, E_TYPE_ERROR, "name must be a String"); + } name_val = kw_values[0]; } - if (!mrb_nil_p(kw_values[1])) { + if (!mrb_undef_p(kw_values[1])) { + /* Validate priority type - must be Integer */ + if (!mrb_integer_p(kw_values[1])) { + mrb_raise(mrb, E_TYPE_ERROR, "priority must be an Integer"); + } priority = mrb_integer(kw_values[1]); if (priority < 0 || priority > 255) { mrb_raise(mrb, E_ARGUMENT_ERROR, "priority must be 0-255"); @@ -1298,6 +1306,11 @@ mrb_task_name(mrb_state *mrb, mrb_value self) TASK_GET_PTR_OR_RAISE(t, self); + /* Return "(noname)" if name is not set */ + if (mrb_nil_p(t->name)) { + return mrb_str_new_lit(mrb, "(noname)"); + } + return t->name; }