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

ruby-changes:37313

From: nobu <ko1@a...>
Date: Sat, 24 Jan 2015 21:24:43 +0900 (JST)
Subject: [ruby-changes:37313] nobu:r49394 (trunk): ruby.c: replace with real path

nobu	2015-01-24 21:24:27 +0900 (Sat, 24 Jan 2015)

  New Revision: 49394

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

  Log:
    ruby.c: replace with real path
    
    * ruby.c (dladdr_path): replace the executable path with symlinked
      real path.  dladdr(3) on Linux returns the argv[0] as dli_fname
      instead of the real path, for a symbol defined in the executable
      file itself.  [Bug #10776]

  Modified files:
    trunk/file.c
    trunk/ruby.c
Index: ruby.c
===================================================================
--- ruby.c	(revision 49393)
+++ ruby.c	(revision 49394)
@@ -364,6 +364,32 @@ ruby_init_loadpath(void) https://github.com/ruby/ruby/blob/trunk/ruby.c#L364
     ruby_init_loadpath_safe(0);
 }
 
+#if defined(HAVE_DLADDR)
+static VALUE
+dladdr_path(const void* addr)
+{
+    Dl_info dli;
+    VALUE fname, path;
+
+    if (!dladdr(addr, &dli)) {
+	return rb_str_new(0, 0);
+    }
+#ifdef __linux__
+    else if (dli.dli_fname == origarg.argv[0]) {
+	VALUE rb_readlink(VALUE);
+	fname = rb_str_new_cstr("/proc/self/exe");
+	path = rb_readlink(fname);
+    }
+#endif
+    else {
+	fname = rb_str_new_cstr(dli.dli_fname);
+	path = rb_realpath_internal(Qnil, fname, 1);
+    }
+    rb_str_resize(fname, 0);
+    return path;
+}
+#endif
+
 void
 ruby_init_loadpath_safe(int safe_level)
 {
@@ -392,17 +418,7 @@ ruby_init_loadpath_safe(int safe_level) https://github.com/ruby/ruby/blob/trunk/ruby.c#L418
 #elif defined(__EMX__)
     _execname(libpath, sizeof(libpath) - 1);
 #elif defined(HAVE_DLADDR)
-    Dl_info dli;
-    if (dladdr((void *)(VALUE)expand_include_path, &dli)) {
-	char fbuf[MAXPATHLEN];
-	char *f = dln_find_file_r(dli.dli_fname, getenv(PATH_ENV), fbuf, sizeof(fbuf));
-	VALUE fname = rb_str_new_cstr(f ? f : dli.dli_fname);
-	rb_str_freeze(fname);
-	sopath = rb_realpath_internal(Qnil, fname, 1);
-    }
-    else {
-	sopath = rb_str_new(0, 0);
-    }
+    sopath = dladdr_path((void *)(VALUE)expand_include_path);
     libpath = RSTRING_PTR(sopath);
 #endif
 
Index: file.c
===================================================================
--- file.c	(revision 49393)
+++ file.c	(revision 49394)
@@ -2745,7 +2745,7 @@ rb_file_s_symlink(VALUE klass, VALUE fro https://github.com/ruby/ruby/blob/trunk/file.c#L2745
 #endif
 
 #ifdef HAVE_READLINK
-static VALUE rb_readlink(VALUE path);
+VALUE rb_readlink(VALUE path);
 
 /*
  *  call-seq:
@@ -2764,7 +2764,7 @@ rb_file_s_readlink(VALUE klass, VALUE pa https://github.com/ruby/ruby/blob/trunk/file.c#L2764
     return rb_readlink(path);
 }
 
-static VALUE
+VALUE
 rb_readlink(VALUE path)
 {
     int size = 100;

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

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