Commit Graph

5935 Commits

Author SHA1 Message Date
Yukihiro "Matz" Matsumoto 84d17f2c44 array.c (mrb_ary_clear): remove unnecessary function 2024-10-16 16:33:42 +09:00
Yukihiro "Matz" Matsumoto 8cfc1a4581 variable.c: fix int and mrb_bool confusion 2024-10-15 21:10:10 +09:00
Yukihiro "Matz" Matsumoto 540bd54ed3 variable.c (iv_rehash): name magic number 4 as IV_INITIAL_SIZE 2024-10-15 21:10:10 +09:00
Yukihiro "Matz" Matsumoto fa68e634a7 variable.c (mrb_exc_const_get): E_XXX_ERROR should not call const_missing
As #6359 pointed out, calling const_missing hook from E_XXX_ERROR (that
calls mrb_exc_get_id()) can be an attack vector.  Since E_XXX_ERROR is
supposed to be a defined error class, we think that the situation where
it is undefined and the const_missing hook is called should be detected
as an error; fix #6359
2024-10-15 21:09:48 +09:00
Yukihiro "Matz" Matsumoto 32a527ad6d readfloat.c: fix float to int assignment 2024-10-11 08:45:27 +09:00
Yukihiro "Matz" Matsumoto 1348daa683 vm.c: save offset in a local variable in OP_BLKPUSH 2024-09-27 16:31:13 +09:00
Yukihiro "Matz" Matsumoto b94be7de5a gc.c (mark_context): no need to mark ci->blk; ref #5791
Since the passed block is referenced from the stack after the last
commit.
2024-09-26 02:57:57 +09:00
Yukihiro "Matz" Matsumoto 204928120b vm.c (cipop): fix improper code to check if env is reclaimed; fix #6369
The callinfo refers blk since #5786 but not marked at the time. Later we
added reclamation check by #5791 but its repeated heap scans decrease
the performance drastically in some cases. So the original @dearblue's
solution should be taken

Probably we need to always keep the original block at the bottom of
arguments. And the explicit block argument should be a normal local
variable. We will investigate it later.
2024-09-25 14:12:50 +09:00
John Bampton e12da35645 Fix spelling 2024-09-24 00:14:24 +10:00
Yukihiro "Matz" Matsumoto 17acf23914 readfloat.c: we don't need long double for mruby; fix #6365
`mrb_read_float()` function does not raise ERANGE (unlike `strtod()`)
so we don't need high precision double for calculation.
2024-09-23 08:11:23 +09:00
Yukihiro "Matz" Matsumoto bd668e4c9d readfloat.c: new implementation of mrb_read_float(); ref #6187
The new version gives more accurate values for decimal number
representation that are not divisible in binary representations, for
example `0.3`.

The function uses `long double` for precision. Please report if `long
double` causes problems on any platform (especially microcontrollers).
Ref #6182
2024-09-21 02:47:42 +09:00
dearblue cf23861166 Making splat argument objects invisible from Ruby side
The `mrb_get_argv()` function and the `*` specifier of `mrb_get_args()` get the address of the argument.
At this time, if it is passed in the form of a splat argument, it will be an address to an element of an array object.

After getting the pointer to the array object, the caller may call `mrb_vm_exec()` directly or indirectly.
At this time, a splat argument with the class set can be retrieved as an array object by searching with `ObjectSpace.each_object`.
If changes are made as array objects, addresses on the heap as arrays may become invalid, or objects in the array may be recycled by the GC.
When the caller references the changed address in a subsequent operation, use-after-free is established.

This patch assigns `NULL` as the class of the array object so that it cannot be detected by `ObjectSpace.each_object` from the Ruby side.
2024-09-19 23:13:18 +09:00
Yukihiro "Matz" Matsumoto e3ff54fda3 vm.c (mrb_vm_exec): unify declaration and initialization of variables 2024-09-18 22:32:35 +09:00
Yukihiro "Matz" Matsumoto d1d010a03a array.c (mrb_ary_delete): array index should be mrb_int 2024-09-17 12:07:39 +09:00
Yukihiro "Matz" Matsumoto 4b500eb971 Merge pull request #6340 from dearblue/array-cmp 2024-09-17 11:29:41 +09:00
Yukihiro "Matz" Matsumoto de6955b1b0 vm.c (mrb_vm_run): merge declaration and initialization 2024-09-16 17:50:13 +09:00
Yukihiro "Matz" Matsumoto fddc7650ca numeric.c (int_ceil): should rename mrb_bint_add_d to mrb_bint_add_n 2024-09-15 04:00:52 +09:00
Yukihiro "Matz" Matsumoto bdbf8536a7 mruby-bigint: rename add_d and sub_d to add_n and sub_n respectively
`_n` suffix represents `no_normalize`.
2024-09-15 03:02:41 +09:00
dearblue 0955539cf9 Fix use-after-free in mrb_ary_delete()
`mrb_equal()` may call `obj.==` method internally.
Therefore, using an unupdated pointer and length after `mrb_equal()` could result in a read/write to an invalid address.

Fresh properties must always be obtained regardless of the result of `mrb_equal()`.
Also, `ary_modify()` must be called each time before writing.

ref. #6339
2024-09-13 21:44:56 +09:00
Yukihiro "Matz" Matsumoto 6e44c0bc91 vm.c (argnum_error): merge declaration and initialization 2024-09-13 07:27:17 +09:00
Yukihiro "Matz" Matsumoto 704ad87150 Merge pull request #6338 from dearblue/proc-align 2024-09-12 06:43:42 +09:00
Yukihiro "Matz" Matsumoto 0972c84773 array.c (mrb_ary_delete): protect return value; fix #6339
The C local variable is not protected from GC, so we use the function
mrb_gc_protect() to keep the value. We also keep the arena position by
mrb_gc_arena_save(), then restoring the position for every new return
value, to minimize arena size.

Small cosmetic changes (pre-increment to post-increment) are also made
in this commit.
2024-09-09 14:57:32 +09:00
Yukihiro "Matz" Matsumoto 2d871fb1ef vm.c (catch_handler_find): merge declaration and initialization 2024-09-09 07:10:50 +09:00
Yukihiro "Matz" Matsumoto a3aff8f437 vm.c (mrb_yield_cont): merge declaration and initialization 2024-09-07 08:36:02 +09:00
Yukihiro "Matz" Matsumoto 1f9fa06119 array.c: no need to assert if blk is a Proc; ref #6344
Since `blk` always comes from `mrb_get_args`, it should always be either
`nil` or a Proc.
2024-09-05 15:26:09 +09:00
leviongit 020cfa9283 prefer using mrb_yield to call block arguments 2024-09-04 20:44:51 +02:00
dearblue e476d9a344 Need to restore the GC arena after some function calls
When calling `mrb_equal()` or `mrb_funcall()` family functions, the GC arena should be restored if the loop is repeated by a non-immediate return value.

In my opinion, restoring the GC arena is unnecessary when a non-immediate (true) value causes the function to return (e.g. the `mrb_ary_index_m()` function).

The patch does not take into account the case of recursive calls and may be incomplete.
2024-09-03 21:29:06 +09:00
dearblue 29496c9931 Fix use-after-free for Array#<=>
The `mrb_ary_cmp()` function calls `mrb_cmp()` for comparison, but `mrb_cmp()` may call the `obj.<=>` method internally.
If a user-defined `<=>` method is called and the array object under comparison is expanded or reduced, a reference to an invalid address may subsequently be made.
2024-09-03 21:25:31 +09:00
Yukihiro "Matz" Matsumoto 96cf9ba230 vm.c (mrb_yield_with_class): merge declaration and initialization 2024-09-03 11:58:20 +09:00
Yukihiro "Matz" Matsumoto 4062069679 gc.c (gc_arena_keep): revert 2 commits regarding arena allocation; #6329
We assumed there's no need for gc_arena_keep() when MRB_GC_FIXED_ARENA
is set.  But it turned out that gc_protect() still can cause use-after-free
with fixed arena.

Revert "gc.c (gc_protect): should not call gc_arena_keep twice from allocation"

This reverts commit 28ece4ed8b.

Revert "gc.c (gc_arena_keep): reorganized for MRB_GC_FIXED_ARENA; ref #6329"

This reverts commit 33dd623a02.
2024-09-02 23:00:09 +09:00
Yukihiro "Matz" Matsumoto 6c4dbe8584 vm.c (eval_under): unify declaration and initialization of variables 2024-09-02 11:52:32 +09:00
Yukihiro "Matz" Matsumoto 472f699ee6 vm.c (mrb_f_send): unify declaration and initialization of variables 2024-09-01 22:29:46 +09:00
dearblue 42513d61fd Need to place static proc objects into 8-byte alignments
Static proc objects defined as methods may be placed in 4-byte alignments in 32-bit environments.
This may be misinterpreted as an immediate value depending on the address.

Since C11 and C++11 have additional language features for byte alignment, corresponding compilers use them to define the `mrb_alignas()` macro.
For earlier compilers, they use their own extensions to define the `mrb_alignas()` macro.

GCC supports `__attribute__((aligned(alignment)))` since at least version 2.95.3 (1999).
https://gcc.gnu.org/onlinedocs/gcc-2.95.3/gcc_4.html#IDX305
According to GPT-4, support was added in version 2.7 (1995).

It is not known which version of Visual C++ added support for `__declspec(align(n))`.
According to GPT-4, at least Visual C++ 6.0 (1998) seems to support it.
Also, the documentation of past Intel C/C++ compilers that support `__declspec(align(n))` makes reference to support with Visual C++ 4.2 (1996).
https://www.intel.com/content/dam/www/public/ijkk/jp/ja/documents/developer/ccomp40j.pdf
2024-09-01 20:28:34 +09:00
Yukihiro "Matz" Matsumoto 56c3d748fb Merge pull request #6335 from dearblue/OP_RETURN 2024-08-30 10:53:58 +09:00
Yukihiro "Matz" Matsumoto 6de3009606 Merge pull request #6328 from dearblue/env-obj_free 2024-08-28 16:40:04 +09:00
Yukihiro "Matz" Matsumoto 540d976f7f array.c (sort_cmp): mrb_cmp() may return -2 for errors 2024-08-27 22:36:24 +09:00
dearblue 7ec5d47a91 Add return_ci in CHECKPOINT_MAIN() of OP_RETURN
For role clarity, distinguish between `ci` and `return_ci`.
2024-08-27 21:39:09 +09:00
Yukihiro "Matz" Matsumoto 28ece4ed8b gc.c (gc_protect): should not call gc_arena_keep twice from allocation 2024-08-27 11:03:14 +09:00
Yukihiro "Matz" Matsumoto ef5ae1c629 Merge pull request #6333 from dearblue/heap_p 2024-08-26 05:49:49 +09:00
Yukihiro "Matz" Matsumoto 33dd623a02 gc.c (gc_arena_keep): reorganized for MRB_GC_FIXED_ARENA; ref #6329 2024-08-26 05:47:28 +09:00
Yukihiro "Matz" Matsumoto b9c93673f9 Merge pull request #6329 from dearblue/mrb_obj_alloc 2024-08-26 05:40:12 +09:00
Yukihiro "Matz" Matsumoto 325c918464 class.c: use mrb_unboxed_type where obj is not immediate for sure 2024-08-26 05:33:19 +09:00
dearblue 98fdfe1037 Reduce the number of branch instructions in the heap_p()
As far as `gcc -S` for several CPU architectures has confirmed, it reduces the number of branch instructions by one.
2024-08-25 20:35:41 +09:00
dearblue 1c5839fb01 Fix use-after-free in mrb_obj_alloc()
When GC occurs during the expansion of the GC arena by `gc_protect()` in `mrb_obj_alloc()`, the object page just allocated by `add_heap()` is released.
Therefore, as soon as control returns from `gc_protect()`, there is a possibility of illegal writing or reading to the address just released.

This issue was discovered during the investigation of #6326.
2024-08-25 10:55:15 +09:00
dearblue 13571402d2 Add a precondition to call mrb_env_unshare().
The following assertions can be added to omit the `if` block

  - env object must be non-null
  - env object must be in a shared state with the stack

The current caller is believed to satisfy the condition.
2024-08-24 17:30:54 +09:00
dearblue 22b1ac9070 Fix use-after-free in obj_free() for env objects
A reference to an invalid address might occur in `is_dead()` of `obj_free()` called from `incremental_sweep_phase()`.
This would happen if the heap page was freed ahead of time in the same `incremental_sweep_phase()`.

fixed #6326
2024-08-24 16:46:27 +09:00
Yukihiro "Matz" Matsumoto f35000f2a9 array.c (sort_cmp): comparing objects may be freed by GC; #6326
If comparing function (block or `<=>`) modifies the sorting array and GC
happens after the modification, objects passed to comparison may be
freed by GC.
2024-08-23 22:29:45 +09:00
Yukihiro "Matz" Matsumoto 58c70834d9 array.c (srot_cmp): need modify check after mrb_cmp as well; #6326
mrb_cmp() may also modify the sorting array internally.
2024-08-22 07:49:16 +09:00
Yukihiro "Matz" Matsumoto 752ebe6b7f array.c (mrb_ary_sort_bang): check if array is modified in blocks
This address at least part of #6326. CRuby copied the array internally,
but mruby avoid copying to reserve memory.
2024-08-21 18:31:46 +09:00
Yukihiro "Matz" Matsumoto 4b9f567821 vm.c (exec_irep): unify declaration and initialization 2024-08-20 12:49:45 +09:00