summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog7
-rw-r--r--ext/dl/cptr.c1
-rw-r--r--ext/dl/handle.c1
-rw-r--r--ext/fiddle/handle.c1
-rw-r--r--ext/fiddle/pointer.c1
-rw-r--r--test/dl/test_cptr.rb4
-rw-r--r--test/dl/test_handle.rb4
-rw-r--r--test/fiddle/test_handle.rb7
-rw-r--r--test/fiddle/test_pointer.rb4
-rw-r--r--test/ruby/envutil.rb2
-rw-r--r--version.h8
11 files changed, 35 insertions, 5 deletions
diff --git a/ChangeLog b/ChangeLog
index f4463eda17..2ac2de1259 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+Mon Jun 23 16:45:48 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * 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].
+
Wed May 28 13:24:39 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
* configure.in (rb_cv_func___builtin_unreachable): try with an
diff --git a/ext/dl/cptr.c b/ext/dl/cptr.c
index 667c65172c..b315a46186 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 832ff3319a..4bb402bdfa 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 3667a84bd8..d115d3d131 100644
--- a/ext/fiddle/pointer.c
+++ b/ext/fiddle/pointer.c
@@ -65,6 +65,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 5c1c1930ec..7621e1d933 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 fc196f4b30..4efb0190f2 100644
--- a/test/ruby/envutil.rb
+++ b/test/ruby/envutil.rb
@@ -340,7 +340,7 @@ eom
assert_warning(*args) {$VERBOSE = false; yield}
end
- def assert_no_memory_leak(args, prepare, code, message=nil, limit: 2.0, rss: false)
+ def assert_no_memory_leak(args, prepare, code, message=nil, limit: 1.5, rss: false)
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
diff --git a/version.h b/version.h
index 163207e63f..36174171c0 100644
--- a/version.h
+++ b/version.h
@@ -1,10 +1,10 @@
#define RUBY_VERSION "2.0.0"
-#define RUBY_RELEASE_DATE "2014-05-28"
-#define RUBY_PATCHLEVEL 490
+#define RUBY_RELEASE_DATE "2014-06-23"
+#define RUBY_PATCHLEVEL 491
#define RUBY_RELEASE_YEAR 2014
-#define RUBY_RELEASE_MONTH 5
-#define RUBY_RELEASE_DAY 28
+#define RUBY_RELEASE_MONTH 6
+#define RUBY_RELEASE_DAY 23
#include "ruby/version.h"