summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorshugo <shugo@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2010-03-13 01:34:38 +0000
committershugo <shugo@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2010-03-13 01:34:38 +0000
commitd9fe7ef4924d0e30a0de4ca7ee9c45638b8ebcb4 (patch)
tree9cf3d1c956ed183dca2830b08e1232636ccfe557
parentfd684f1082e25f1752ba2bfcd7c3b3525261795b (diff)
* load.c (rb_get_expanded_load_path): does not expand paths if all
the items in $: are absolute paths. [ruby-core:28113] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@26902 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r--ChangeLog5
-rw-r--r--file.c14
-rw-r--r--include/ruby/intern.h1
-rw-r--r--load.c13
4 files changed, 24 insertions, 9 deletions
diff --git a/ChangeLog b/ChangeLog
index e67e620f68..2fc08daacb 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+Sat Mar 13 10:16:32 2010 Shugo Maeda <shugo@ruby-lang.org>
+
+ * load.c (rb_get_expanded_load_path): does not expand paths if all
+ the items in $: are absolute paths. [ruby-core:28113]
+
Sat Mar 13 10:03:52 2010 Hidetoshi NAGAI <nagai@ai.kyutech.ac.jp>
* ext/tk/extconf.rb: fix [Bug #2840] Tk doesn't built in mingw.
diff --git a/file.c b/file.c
index 4e0a0f13e4..aed663ac11 100644
--- a/file.c
+++ b/file.c
@@ -2687,8 +2687,6 @@ ntfs_tail(const char *path)
(void)(extenc || (extenc = rb_default_external_encoding())),\
rb_enc_associate(result, extenc))
-static int is_absolute_path(const char*);
-
VALUE
rb_home_dir(const char *user, VALUE result)
{
@@ -2802,7 +2800,7 @@ file_expand_path(VALUE fname, VALUE dname, int abs_mode, VALUE result)
}
}
#endif
- else if (!is_absolute_path(s)) {
+ else if (!rb_is_absolute_path(s)) {
if (!NIL_P(dname)) {
file_expand_path(dname, Qnil, abs_mode, result);
BUFINIT();
@@ -4704,8 +4702,8 @@ rb_file_const(const char *name, VALUE value)
rb_define_const(rb_mFConst, name, value);
}
-static int
-is_absolute_path(const char *path)
+int
+rb_is_absolute_path(const char *path)
{
#ifdef DOSISH_DRIVE_LETTER
if (has_drive_letter(path) && isdirsep(path[2])) return 1;
@@ -4735,7 +4733,7 @@ path_check_0(VALUE path, int execpath)
const char *p0 = StringValueCStr(path);
char *p = 0, *s;
- if (!is_absolute_path(p0)) {
+ if (!rb_is_absolute_path(p0)) {
char *buf = my_getcwd();
VALUE newpath;
@@ -4872,7 +4870,7 @@ rb_find_file_ext_safe(VALUE *filep, const char *const *ext, int safe_level)
expanded = 1;
}
- if (expanded || is_absolute_path(f) || is_explicit_relative(f)) {
+ if (expanded || rb_is_absolute_path(f) || is_explicit_relative(f)) {
if (safe_level >= 1 && !fpath_check(fname)) {
rb_raise(rb_eSecurityError, "loading from unsafe path %s", f);
}
@@ -4943,7 +4941,7 @@ rb_find_file_safe(VALUE path, int safe_level)
expanded = 1;
}
- if (expanded || is_absolute_path(f) || is_explicit_relative(f)) {
+ if (expanded || rb_is_absolute_path(f) || is_explicit_relative(f)) {
if (safe_level >= 1 && !fpath_check(path)) {
rb_raise(rb_eSecurityError, "loading from unsafe path %s", f);
}
diff --git a/include/ruby/intern.h b/include/ruby/intern.h
index 61f642b06a..1ae13ee73b 100644
--- a/include/ruby/intern.h
+++ b/include/ruby/intern.h
@@ -366,6 +366,7 @@ char *rb_path_skip_prefix(const char *);
char *rb_path_last_separator(const char *);
char *rb_path_end(const char *);
VALUE rb_file_directory_p(VALUE,VALUE);
+int rb_is_absolute_path(const char *);
/* gc.c */
void ruby_set_stack_size(size_t);
NORETURN(void rb_memerror(void));
diff --git a/load.c b/load.c
index 7551b6b629..5f69fd3d56 100644
--- a/load.c
+++ b/load.c
@@ -37,10 +37,21 @@ VALUE
rb_get_expanded_load_path(void)
{
VALUE load_path = rb_get_load_path();
- VALUE ary = rb_ary_new2(RARRAY_LEN(load_path));
+ VALUE ary;
long i;
for (i = 0; i < RARRAY_LEN(load_path); ++i) {
+ VALUE str = RARRAY_PTR(load_path)[i];
+ if (TYPE(str) != T_STRING)
+ RB_GC_GUARD(str) = rb_get_path(str);
+ if (!rb_is_absolute_path(RSTRING_PTR(str)))
+ goto relative_path_found;
+ }
+ return load_path;
+
+ relative_path_found:
+ ary = rb_ary_new2(RARRAY_LEN(load_path));
+ for (i = 0; i < RARRAY_LEN(load_path); ++i) {
VALUE path = rb_file_expand_path(RARRAY_PTR(load_path)[i], Qnil);
rb_str_freeze(path);
rb_ary_push(ary, path);