👍
пн, 2 окт. 2023 г. в 01:57, peterzhu2118 (Peter Zhu) via ruby-core <
ruby-core(a)ml.ruby-lang.org>gt;:
Issue #18553 has been updated by peterzhu2118 (Peter
Zhu).
Status changed from Open to Closed
This was fixed in #19906, so I will close this issue.
----------------------------------------
Bug #18553: Memory leak on compiling method call with kwargs
https://bugs.ruby-lang.org/issues/18553#change-104808
* Author: ibylich (Ilya Bylich)
* Status: Closed
* Priority: Normal
* Assignee: ko1 (Koichi Sasada)
* ruby -v: ruby 3.2.0dev
* Backport: 2.6: UNKNOWN, 2.7: UNKNOWN, 3.0: UNKNOWN, 3.1: UNKNOWN
----------------------------------------
The following code produces a memory leak:
```ruby
p(foo: 1)
```
It comes from the allocation in `compile.c`:
```c
struct rb_callinfo_kwarg *kw_arg =
rb_xmalloc_mul_add(len, sizeof(VALUE), sizeof(struct
rb_callinfo_kwarg));
```
Later it's packed into `struct rb_callinfo`, but `imemo_callinfo` is a
GC-managed object that has no `free` calls in `obj_free` function in gc.c.
[I've tried to fix it](
https://github.com/ruby/ruby/pull/5488/files#diff-d1cee85c3b0e24a64519c1115…)
by calling `free` on `callinfo->kwarg` and it fixed leak in `./miniruby -e
'p(foo: 1)'`, but it breaks `make install`. My addition causes a
double-free error, looks like either `callinfo` or `callinfo->kwarg` is
shared between multiple objects.
`kwarg` field is a `const` pointer, so that's somewhat expected (I was
under impression that `const` qualifier is redundant) :)
I'm pretty sure old versions of Ruby are also affected by this memory leak.
--
https://bugs.ruby-lang.org/
______________________________________________
ruby-core mailing list -- ruby-core(a)ml.ruby-lang.org
To unsubscribe send an email to ruby-core-leave(a)ml.ruby-lang.org
ruby-core info --
https://ml.ruby-lang.org/mailman3/postorius/lists/ruby-core.ml.ruby-lang.or…