mirror of
https://github.com/mruby/mruby
synced 2026-06-08 16:11:16 +00:00
Fixed "Out-of-bounds Read" and "Divide-by-Zero" in ary_product_group()
Reproduction:
- Out-of-bounds Read
```console
% build/host/bin/mruby -e '([nil] * 256).__product_group([[nil] * 256], 1 << 32, 256)'
zsh: segmentation fault (core dumped) build/host/bin/mruby -e
```
- Divide-by-Zero
```console
% build/host/bin/mruby -e '([nil] * 256).__product_group([[]], 1 << 32, 256)'
zsh: floating point exception (core dumped) build/host/bin/mruby -e '([nil] * 256).__product_group([[]], 1 << 32, 256)'
```
This commit is contained in:
@@ -1395,9 +1395,15 @@ ary_product_group(mrb_state *mrb, mrb_value self_ary)
|
||||
mrb_value a = RARRAY_PTR(arys_ary)[j]; // arys[j]
|
||||
mrb_check_type(mrb, a, MRB_TT_ARRAY);
|
||||
mrb_int b = RARRAY_LEN(a); // a.size
|
||||
if (b <= 0) {
|
||||
mrb_raise(mrb, E_ARGUMENT_ERROR, "cannot compute product with an empty array");
|
||||
}
|
||||
mrb_ary_set(mrb, group, j + 1, RARRAY_PTR(a)[n % b]);
|
||||
n /= b;
|
||||
}
|
||||
if (n >= RARRAY_LEN(self_ary)) {
|
||||
mrb_raise(mrb, E_INDEX_ERROR, "index out of range");
|
||||
}
|
||||
mrb_ary_set(mrb, group, 0, RARRAY_PTR(self_ary)[n]);
|
||||
|
||||
return group;
|
||||
|
||||
Reference in New Issue
Block a user