[前][次][番号順一覧][スレッド一覧]

ruby-changes:13673

From: tenderlove <ko1@a...>
Date: Sun, 25 Oct 2009 06:56:59 +0900 (JST)
Subject: [ruby-changes:13673] Ruby:r25458 (trunk): * ext/dl/handle.c (rb_dlhandle_close) check return value of dlclose()

tenderlove	2009-10-25 06:56:50 +0900 (Sun, 25 Oct 2009)

  New Revision: 25458

  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=25458

  Log:
    * ext/dl/handle.c (rb_dlhandle_close) check return value of dlclose()

  Modified files:
    trunk/ext/dl/handle.c
    trunk/test/dl/test_handle.rb

Index: ext/dl/handle.c
===================================================================
--- ext/dl/handle.c	(revision 25457)
+++ ext/dl/handle.c	(revision 25458)
@@ -57,8 +57,21 @@
     struct dl_handle *dlhandle;
 
     TypedData_Get_Struct(self, struct dl_handle, &dlhandle_data_type, dlhandle);
-    dlhandle->open = 0;
-    return INT2NUM(dlclose(dlhandle->ptr));
+    if(dlhandle->open) {
+	dlhandle->open = 0;
+	int ret = dlclose(dlhandle->ptr);
+
+	/* Check dlclose for successful return value */
+	if(ret) {
+#if defined(HAVE_DLERROR)
+	    rb_raise(rb_eDLError, dlerror());
+#else
+	    rb_raise(rb_eDLError, "could not close handle");
+#endif
+	}
+	return INT2NUM(ret);
+    }
+    rb_raise(rb_eDLError, "dlclose() called too many times");
 }
 
 VALUE
@@ -301,3 +314,5 @@
     rb_define_method(rb_cDLHandle, "disable_close", rb_dlhandle_disable_close, 0);
     rb_define_method(rb_cDLHandle, "enable_close", rb_dlhandle_enable_close, 0);
 }
+
+/* mode: c; tab-with=8; sw=8; ts=8; noexpandtab: */
Index: test/dl/test_handle.rb
===================================================================
--- test/dl/test_handle.rb	(revision 25457)
+++ test/dl/test_handle.rb	(revision 25458)
@@ -2,6 +2,19 @@
 
 module DL
   class TestHandle < TestBase
+    def test_handle_close
+      handle = DL::Handle.new(LIBC_SO)
+      assert_equal 0, handle.close
+    end
+
+    def test_handle_close_twice
+      handle = DL::Handle.new(LIBC_SO)
+      handle.close
+      assert_raises(DL::DLError) do
+        handle.close
+      end
+    end
+
     def test_dlopen_returns_handle
       assert_instance_of DL::Handle, dlopen(LIBC_SO)
     end

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]