From: "Игорь Пятчиц via ruby-core" Date: 2023-10-02T20:07:20+06:00 Subject: [ruby-core:114940] Re: [Ruby master Bug#18553] Memory leak on compiling method call with kwargs --===============8082563700824290637== Content-Type: multipart/alternative; boundary="0000000000008a0de40606bc4b49" --0000000000008a0de40606bc4b49 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable =F0=9F=91=8D =D0=BF=D0=BD, 2 =D0=BE=D0=BA=D1=82. 2023=E2=80=AF=D0=B3. =D0=B2 01:57, pete= rzhu2118 (Peter Zhu) via ruby-core < ruby-core@ml.ruby-lang.org>: > 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 =3D > 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-d1cee85c3b0e24a64519c11= 150abe26fd0b5d8628a23d356dd0b535ac4595d49R3397) > 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 lea= k. > > > > -- > https://bugs.ruby-lang.org/ > ______________________________________________ > ruby-core mailing list -- ruby-core@ml.ruby-lang.org > To unsubscribe send an email to ruby-core-leave@ml.ruby-lang.org > ruby-core info -- > https://ml.ruby-lang.org/mailman3/postorius/lists/ruby-core.ml.ruby-lang.= org/ > --0000000000008a0de40606bc4b49 Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: quoted-printable
=F0=9F=91=8D

=D0=BF=D0=BD, 2 =D0=BE=D0=BA=D1=82. 2023= =E2=80=AF=D0=B3. =D0=B2 01:57, peterzhu2118 (Peter Zhu) via ruby-core <<= a href=3D"mailto:ruby-core@ml.ruby-lang.org">ruby-core@ml.ruby-lang.org= >:
Issue #185= 53 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 =3D
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 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.<= br>
[I've tried to fix it](https://github.com/ruby/ruby/= pull/5488/files#diff-d1cee85c3b0e24a64519c11150abe26fd0b5d8628a23d356dd0b53= 5ac4595d49R3397) 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 `c= allinfo->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 l= eak.



--
https://bugs.ruby-lang.org/
=C2=A0______________________________________________
=C2=A0ruby-core mailing list -- ruby-core@ml.ruby-lang.org
=C2=A0To unsubscribe send an email to ruby-core-leave@ml.ruby-lang.org
=C2=A0ruby-core info -- https://ml.ruby-lang.org/mailman3/postorius/lists/ruby-core.ml.ruby-lang.o= rg/
--0000000000008a0de40606bc4b49-- --===============8082563700824290637== Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Disposition: inline ______________________________________________ ruby-core mailing list -- ruby-core@ml.ruby-lang.org To unsubscribe send an email to ruby-core-leave@ml.ruby-lang.org ruby-core info -- https://ml.ruby-lang.org/mailman3/postorius/lists/ruby-core.ml.ruby-lang.org/ --===============8082563700824290637==--