From: "ibylich (Ilya Bylich)" Date: 2022-01-27T14:30:12+00:00 Subject: [ruby-core:107302] [Ruby master Bug#18553] Memory leak on compiling method call with kwargs Issue #18553 has been reported by ibylich (Ilya Bylich). ---------------------------------------- Bug #18553: Memory leak on compiling method call with kwargs https://bugs.ruby-lang.org/issues/18553 * Author: ibylich (Ilya Bylich) * Status: Open * Priority: Normal * 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-d1cee85c3b0e24a64519c11150abe26fd0b5d8628a23d356dd0b535ac4595d49R3397) 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/ Unsubscribe: