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-d1cee85c3b0e24a64519c…
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/