From: Masaki Fukushima Date: 1999-07-15T21:10:44+09:00 Subject: [ruby-dev:7320] empty string in load path (Re: Ruby 1.3.5) 福嶋です。 configure に --with-search-path というのが追加されましたね。 ところで、この --with-search-path を指定しなかった場合、 RUBY_SEARCH_PATHに空文字列が設定されてしまいます。 そして以下のようなファイルが存在する状態で、 ./foo.so /usr/local/lib/ruby/1.3/i586-linux/foo.so require 'foo' とやると、LoadError が発生します。 理由は以下のようなことだと思います。 1. まず stat("" + "foo.so") で、カレントディレクトリの foo.so が 見つかる。 2. 次に dlopen("foo.so",...) が呼ばれるが、カレントディレクトリ は検索されないので、これがエラーになる。 このエラーは理由が分かりづらいので、いっそのこと $: の中の空文字 列はファイルの検索時には全て無視するようにした方が良いんじゃない でしょうか? パッチです。 Index: configure.in =================================================================== RCS file: /home/cvs/ruby/configure.in,v retrieving revision 1.1.1.2.2.24 diff -u -r1.1.1.2.2.24 configure.in --- configure.in 1999/07/15 07:59:37 1.1.1.2.2.24 +++ configure.in 1999/07/15 11:52:05 @@ -781,7 +781,9 @@ AC_ARG_WITH(search-path, [--with-search-path specify the additional search path], [search_path=$withval]) -AC_DEFINE_UNQUOTED(RUBY_SEARCH_PATH,"$search_path") +if test "$search_path" != ""; then + AC_DEFINE_UNQUOTED(RUBY_SEARCH_PATH,"$search_path") +fi echo "creating config.h" cat confdefs.h > config.h Index: eval.c =================================================================== RCS file: /home/cvs/ruby/eval.c,v retrieving revision 1.1.1.3.2.27 diff -u -r1.1.1.3.2.27 eval.c --- eval.c 1999/07/15 07:59:38 1.1.1.3.2.27 +++ eval.c 1999/07/15 11:52:05 @@ -4490,10 +4490,15 @@ int i; Check_Type(rb_load_path, T_ARRAY); + vpath = rb_ary_new(); for (i=0;ilen;i++) { - Check_SafeStr(RARRAY(rb_load_path)->ptr[i]); + VALUE str = RARRAY(rb_load_path)->ptr[i]; + Check_SafeStr(str); + if (RSTRING(str)->len > 0) { + rb_ary_push(vpath, str); + } } - vpath = rb_ary_join(rb_load_path, rb_str_new2(RUBY_PATH_SEP)); + vpath = rb_ary_join(vpath, rb_str_new2(RUBY_PATH_SEP)); path = STR2CSTR(vpath); if (safe_level >= 2 && !rb_path_check(path)) { rb_raise(rb_eSecurityError, "loading from unsefe path %s", path); --- 福嶋正機