Bug #9599
closed
Fiddle::Function#call leaks memory
Added by nobu (Nobuyoshi Nakada) almost 11 years ago.
Updated over 10 years ago.
Description
Fiddle::Function#call
seems leaking memory.
With the following code:
# fiddle-memleak.rb
require 'fiddle'
n = 10
a = ["a"] * n
f = Fiddle::Function.new(Fiddle.dlopen(nil)["rb_obj_tainted"], [Fiddle::TYPE_VOIDP]*n, Fiddle::TYPE_VOID)
loop {f.call(*a); GC.start}
VSZ and RSS increase continuaslly.
$ ruby fiddle-memleak.rb & while ps -ovsz=,rss= $!; do sleep 1; done
[1] 93595
2423344 24
2461024 8884
2463072 10420
2464096 11940
2465120 13428
2467168 14948
2468192 16476
2469216 17980
2471264 19432
2473312 20940
2474336 22424
2475360 23936
2478432 25468
2481504 26996
2482528 28468
2483552 29984
2485600 31524
2486624 33056
2487652 34568
2488676 36100
2490724 37628
2491748 39152
RGenGC seems unrelated since the result in 2.0.0 is similar.
Because Fiddle::Pointer class was alloced with TypedData_Make_Struct macro, it must be freed with ruby_xfree.
Same applies to ext/fiddle/handle.c, ext/dl/cptr.c and ext/dl/handle.c
Here is a patch.
diff --git a/pointer.c b/pointer.c
index 0a914dd..99c7596 100644
--- a/pointer.c
+++ b/pointer.c
@@ -65,6 +65,7 @@ fiddle_ptr_free(void ptr)
((data->free))(data->ptr);
}
}
static size_t
- Status changed from Assigned to Closed
- % Done changed from 0 to 100
Applied in changeset r45291.
ext/dl, ext/fiddle: fix memory leak
- ext/dl/cptr.c (dlptr_free), ext/dl/handle.c (dlhandle_free),
ext/fiddle/handle.c (fiddle_handle_free),
ext/fiddle/pointer.c (fiddle_ptr_free): fix memory leak.
based on the patch Heesob Park at [ruby-dev:48021] [Bug #9599].
- Backport changed from 1.9.3: UNKNOWN, 2.0.0: UNKNOWN, 2.1: UNKNOWN to 1.9.3: UNKNOWN, 2.0.0: REQUIRED, 2.1: REQUIRED
r40930 and r45298 were backported to ruby_2_0_0 (at r45371 and r45372) to resolv conflicts.
And I want to backport r45291, r45299, r45301, r45314, r45315 and r45325, but with them dl and fiddle tests fail. I wonder if there are any other memory leaks.
r45311 was also backported to ruby_2_0_0. It fixes a bug introduced by r45298.
- Backport changed from 1.9.3: UNKNOWN, 2.0.0: REQUIRED, 2.1: REQUIRED to 1.9.3: UNKNOWN, 2.0.0: REQUIRED, 2.1: DONE
r45291, r45299, r45314 and r45325 were backported into ruby_2_1 at 45820.
backported into ruby_2_0_0 at r46508.
- Backport changed from 1.9.3: UNKNOWN, 2.0.0: REQUIRED, 2.1: DONE to 1.9.3: UNKNOWN, 2.0.0: DONE, 2.1: DONE
Also available in: Atom
PDF
Like0
Like0Like0Like0Like0Like0Like0Like0Like0Like0