From acd893d1755cc87542f36131f40c9c3f0aa5bc04 Mon Sep 17 00:00:00 2001 From: nagachika Date: Sun, 4 May 2014 17:32:44 +0000 Subject: merge revision(s) r45291,r45299,r45314,r45325: [Backport #9518] * 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]. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_2_1@45820 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ChangeLog | 7 +++++++ ext/dl/cptr.c | 1 + ext/dl/handle.c | 1 + ext/fiddle/handle.c | 1 + ext/fiddle/pointer.c | 1 + test/dl/test_cptr.rb | 4 ++++ test/dl/test_handle.rb | 4 ++++ test/fiddle/test_handle.rb | 7 +++++++ test/fiddle/test_pointer.rb | 4 ++++ test/ruby/envutil.rb | 4 ++-- version.h | 2 +- 11 files changed, 33 insertions(+), 3 deletions(-) diff --git a/ChangeLog b/ChangeLog index a8631f7986..61817c79f3 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +Mon May 5 02:21:48 2014 Nobuyoshi Nakada + + * 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]. + Mon May 5 01:20:27 2014 Eric Wong * gc.c (rb_gc_writebarrier): drop special case for big hash/array diff --git a/ext/dl/cptr.c b/ext/dl/cptr.c index 3f8858c4b3..d34309379b 100644 --- a/ext/dl/cptr.c +++ b/ext/dl/cptr.c @@ -49,6 +49,7 @@ dlptr_free(void *ptr) (*(data->free))(data->ptr); } } + xfree(ptr); } static size_t diff --git a/ext/dl/handle.c b/ext/dl/handle.c index ef182e816f..6b90e089ee 100644 --- a/ext/dl/handle.c +++ b/ext/dl/handle.c @@ -38,6 +38,7 @@ dlhandle_free(void *ptr) if( dlhandle->ptr && dlhandle->open && dlhandle->enable_close ){ dlclose(dlhandle->ptr); } + xfree(ptr); } static size_t diff --git a/ext/fiddle/handle.c b/ext/fiddle/handle.c index 330dbafe67..36970a2248 100644 --- a/ext/fiddle/handle.c +++ b/ext/fiddle/handle.c @@ -40,6 +40,7 @@ fiddle_handle_free(void *ptr) if( fiddle_handle->ptr && fiddle_handle->open && fiddle_handle->enable_close ){ dlclose(fiddle_handle->ptr); } + xfree(ptr); } static size_t diff --git a/ext/fiddle/pointer.c b/ext/fiddle/pointer.c index 0129363a8d..b763a0c123 100644 --- a/ext/fiddle/pointer.c +++ b/ext/fiddle/pointer.c @@ -56,6 +56,7 @@ fiddle_ptr_free(void *ptr) (*(data->free))(data->ptr); } } + xfree(ptr); } static size_t diff --git a/test/dl/test_cptr.rb b/test/dl/test_cptr.rb index c3793859d7..aa74a73fe5 100644 --- a/test/dl/test_cptr.rb +++ b/test/dl/test_cptr.rb @@ -219,4 +219,8 @@ module DL assert_raise(DLError) {nullpo[0] = 1} end end + + def test_no_memory_leak + assert_no_memory_leak(%w[-W0 -rdl.so], '', '100_000.times {DL::CPtr.allocate}', rss: true) + end end diff --git a/test/dl/test_handle.rb b/test/dl/test_handle.rb index 83b8af1960..6a8964e9a0 100644 --- a/test/dl/test_handle.rb +++ b/test/dl/test_handle.rb @@ -184,4 +184,8 @@ module DL DL.dlopen("/lib/libc.so.7").sym('strcpy') end if /freebsd/=~ RUBY_PLATFORM end + + def test_no_memory_leak + assert_no_memory_leak(%w[-W0 -rdl.so], '', '100_000.times {DL::Handle.allocate}; GC.start', rss: true) + end end diff --git a/test/fiddle/test_handle.rb b/test/fiddle/test_handle.rb index c598cc33a2..cde3fa816d 100644 --- a/test/fiddle/test_handle.rb +++ b/test/fiddle/test_handle.rb @@ -1,5 +1,6 @@ begin require_relative 'helper' + require_relative '../ruby/envutil' rescue LoadError end @@ -7,6 +8,8 @@ module Fiddle class TestHandle < TestCase include Fiddle + include Test::Unit::Assertions + def test_to_i handle = Fiddle::Handle.new(LIBC_SO) assert_kind_of Integer, handle.to_i @@ -185,5 +188,9 @@ module Fiddle Socket.gethostbyname("localhost") Fiddle.dlopen("/lib/libc.so.7").sym('strcpy') end if /freebsd/=~ RUBY_PLATFORM + + def test_no_memory_leak + assert_no_memory_leak(%w[-W0 -rfiddle.so], '', '100_000.times {Fiddle::Handle.allocate}; GC.start', rss: true) + end end end if defined?(Fiddle) diff --git a/test/fiddle/test_pointer.rb b/test/fiddle/test_pointer.rb index 1d908f64d9..2ba11b4ed7 100644 --- a/test/fiddle/test_pointer.rb +++ b/test/fiddle/test_pointer.rb @@ -230,5 +230,9 @@ module Fiddle assert_raise(DLError) {nullpo[0]} assert_raise(DLError) {nullpo[0] = 1} end + + def test_no_memory_leak + assert_no_memory_leak(%w[-W0 -rfiddle.so], '', '100_000.times {Fiddle::Pointer.allocate}', rss: true) + end end end if defined?(Fiddle) diff --git a/test/ruby/envutil.rb b/test/ruby/envutil.rb index 5ebcabe901..de66102621 100644 --- a/test/ruby/envutil.rb +++ b/test/ruby/envutil.rb @@ -372,7 +372,7 @@ eom assert_warning(*args) {$VERBOSE = false; yield} end - def assert_no_memory_leak(args, prepare, code, message=nil, limit: 1.5, **opt) + def assert_no_memory_leak(args, prepare, code, message=nil, limit: 1.5, rss: false, **opt) require_relative 'memory_status' token = "\e[7;1m#{$$.to_s}:#{Time.now.strftime('%s.%L')}:#{rand(0x10000).to_s(16)}:\e[m" token_dump = token.dump @@ -397,7 +397,7 @@ eom before = err.sub!(/^#{token_re}START=(\{.*\})\n/, '') && Memory::Status.parse($1) after = err.sub!(/^#{token_re}FINAL=(\{.*\})\n/, '') && Memory::Status.parse($1) assert_equal([true, ""], [status.success?, err], message) - ([:size, :rss] & after.members).each do |n| + ([:size, (rss && :rss)] & after.members).each do |n| b = before[n] a = after[n] next unless a > 0 and b > 0 diff --git a/version.h b/version.h index 43ad9c2507..91c96cafa6 100644 --- a/version.h +++ b/version.h @@ -1,6 +1,6 @@ #define RUBY_VERSION "2.1.2" #define RUBY_RELEASE_DATE "2014-05-05" -#define RUBY_PATCHLEVEL 90 +#define RUBY_PATCHLEVEL 91 #define RUBY_RELEASE_YEAR 2014 #define RUBY_RELEASE_MONTH 5 -- cgit v1.2.3