diff options
author | yugui <yugui@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2010-01-30 12:54:41 +0000 |
---|---|---|
committer | yugui <yugui@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2010-01-30 12:54:41 +0000 |
commit | 3cce74dc4c4abfb6840de4ba9bcea4df2f502b15 (patch) | |
tree | ebfdb2480bfc27503496706ff17f853509c01e13 | |
parent | 0777c729cd1ae095ce18b55fb1cdf20b0d34cb0d (diff) |
merges r25605 from trunk into ruby_1_9_1.
--
* test/dl/test_dl2.rb (**) testing malloc and realloc
* ext/dl/dl.c (**) adding documentation
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_9_1@26512 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r-- | ext/dl/dl.c | 13 | ||||
-rw-r--r-- | test/dl/test_dl2.rb | 47 | ||||
-rw-r--r-- | version.h | 2 |
3 files changed, 61 insertions, 1 deletions
diff --git a/ext/dl/dl.c b/ext/dl/dl.c index 7a21fa9d25..39ffc5a1fa 100644 --- a/ext/dl/dl.c +++ b/ext/dl/dl.c @@ -16,6 +16,12 @@ rb_dl_dlopen(int argc, VALUE argv[], VALUE self) return rb_class_new_instance(argc, argv, rb_cDLHandle); } +/* + * call-seq: DL.malloc + * + * Allocate +size+ bytes of memory and return the integer memory address + * for the allocated memory. + */ VALUE rb_dl_malloc(VALUE self, VALUE size) { @@ -26,6 +32,13 @@ rb_dl_malloc(VALUE self, VALUE size) return PTR2NUM(ptr); } +/* + * call-seq: DL.realloc(addr, size) + * + * Change the size of the memory allocated at the memory location +addr+ to + * +size+ bytes. Returns the memory address of the reallocated memory, which + * may be different than the address passed in. + */ VALUE rb_dl_realloc(VALUE self, VALUE addr, VALUE size) { diff --git a/test/dl/test_dl2.rb b/test/dl/test_dl2.rb index 3c854aea8f..00b4e27155 100644 --- a/test/dl/test_dl2.rb +++ b/test/dl/test_dl2.rb @@ -3,6 +3,53 @@ require 'dl/callback' module DL class TestDL < TestBase + # TODO: refactor test repetition + + def test_realloc + str = "abc" + ptr_id = DL.realloc(0, 4) + ptr = CPtr.new(ptr_id, 4) + + assert_equal ptr_id, ptr.to_i + + cfunc = CFunc.new(@libc['strcpy'], TYPE_VOIDP, 'strcpy') + x = cfunc.call([ptr_id,str].pack("l!p").unpack("l!*")) + assert_equal("abc\0", ptr[0,4]) + DL.free ptr_id + end + + def test_realloc_secure + assert_raises(SecurityError) do + Thread.new do + $SAFE = 4 + DL.realloc(0, 4) + end.join + end + end + + def test_malloc + str = "abc" + + ptr_id = DL.malloc(4) + ptr = CPtr.new(ptr_id, 4) + + assert_equal ptr_id, ptr.to_i + + cfunc = CFunc.new(@libc['strcpy'], TYPE_VOIDP, 'strcpy') + x = cfunc.call([ptr_id,str].pack("l!p").unpack("l!*")) + assert_equal("abc\0", ptr[0,4]) + DL.free ptr_id + end + + def test_malloc_security + assert_raises(SecurityError) do + Thread.new do + $SAFE = 4 + DL.malloc(4) + end.join + end + end + def test_call_int() cfunc = CFunc.new(@libc['atoi'], TYPE_INT, 'atoi') x = cfunc.call(["100"].pack("p").unpack("l!*")) @@ -1,5 +1,5 @@ #define RUBY_VERSION "1.9.1" -#define RUBY_PATCHLEVEL 417 +#define RUBY_PATCHLEVEL 418 #define RUBY_VERSION_MAJOR 1 #define RUBY_VERSION_MINOR 9 #define RUBY_VERSION_TEENY 1 |