diff options
author | nagachika <nagachika@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2018-03-18 03:57:37 +0000 |
---|---|---|
committer | nagachika <nagachika@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2018-03-18 03:57:37 +0000 |
commit | 3c5452dba11cc909252eaa97c83f7a31c3a230a6 (patch) | |
tree | 6d0a443af69f74daaffb08d6ebca3017d4cc8e6f /ruby.c | |
parent | 2171d75e9bd14409d62fcc5a8acdbb2ec1c23060 (diff) |
revert r62797, r62784. [Bug #13863]
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_2_4@62801 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'ruby.c')
-rw-r--r-- | ruby.c | 65 |
1 files changed, 31 insertions, 34 deletions
@@ -175,10 +175,8 @@ cmdline_options_init(ruby_cmdline_options_t *opt) return opt; } -static NODE *load_file(VALUE parser, VALUE fname, VALUE f, int script, - ruby_cmdline_options_t *opt); -static VALUE open_load_file(VALUE fname_v, int *xflag); -static void forbid_setid(const char *, const ruby_cmdline_options_t *); +static NODE *load_file(VALUE, VALUE, int, ruby_cmdline_options_t *); +static void forbid_setid(const char *, ruby_cmdline_options_t *); #define forbid_setid(s) forbid_setid((s), opt) static struct { @@ -425,8 +423,6 @@ str_conv_enc(VALUE str, rb_encoding *from, rb_encoding *to) ECONV_UNDEF_REPLACE|ECONV_INVALID_REPLACE, Qnil); } -#else -# define str_conv_enc(str, from, to) (str) #endif void ruby_init_loadpath_safe(int safe_level); @@ -1054,7 +1050,6 @@ proc_options(long argc, char **argv, ruby_cmdline_options_t *opt, int envopt) case 'x': if (envopt) goto noenvopt; - forbid_setid("-x"); opt->xflag = TRUE; s++; if (*s && chdir(s) < 0) { @@ -1444,7 +1439,6 @@ process_options(int argc, char **argv, ruby_cmdline_options_t *opt) { NODE *tree = 0; VALUE parser; - VALUE script_name; const rb_iseq_t *iseq; rb_encoding *enc, *lenc; #if UTF8_PATH @@ -1520,9 +1514,6 @@ process_options(int argc, char **argv, ruby_cmdline_options_t *opt) argc--; argv++; } - if (opt->script[0] == '-' && !opt->script[1]) { - forbid_setid("program input from stdin"); - } } opt->script_name = rb_str_new_cstr(opt->script); @@ -1569,17 +1560,9 @@ process_options(int argc, char **argv, ruby_cmdline_options_t *opt) ienc = enc; #endif } - script_name = opt->script_name; - rb_enc_associate(opt->script_name, - IF_UTF8_PATH(uenc = rb_utf8_encoding(), lenc)); -#if UTF8_PATH - if (uenc != lenc) { - opt->script_name = str_conv_enc(opt->script_name, uenc, lenc); - opt->script = RSTRING_PTR(opt->script_name); - } -#endif + rb_enc_associate(opt->script_name, lenc); rb_obj_freeze(opt->script_name); - if (IF_UTF8_PATH(uenc != lenc, 1)) { + if (IF_UTF8_PATH((uenc = rb_utf8_encoding()) != lenc, 1)) { long i; VALUE load_path = GET_VM()->load_path; const ID id_initial_load_path_mark = INITIAL_LOAD_PATH_MARK; @@ -1615,6 +1598,12 @@ process_options(int argc, char **argv, ruby_cmdline_options_t *opt) rb_funcallv(rb_cISeq, rb_intern_const("compile_option="), 1, &option); #undef SET_COMPILE_OPTION } +#if UTF8_PATH + if (uenc != lenc) { + opt->script_name = str_conv_enc(opt->script_name, uenc, lenc); + opt->script = RSTRING_PTR(opt->script_name); + } +#endif ruby_set_argv(argc, argv); process_sflag(&opt->sflag); @@ -1652,11 +1641,13 @@ process_options(int argc, char **argv, ruby_cmdline_options_t *opt) tree = rb_parser_compile_string(parser, opt->script, opt->e_script, 1); } else { - VALUE f; + if (opt->script[0] == '-' && !opt->script[1]) { + forbid_setid("program input from stdin"); + } + base_block = toplevel_context(toplevel_binding); rb_parser_set_context(parser, base_block, TRUE); - f = open_load_file(script_name, &opt->xflag); - tree = load_file(parser, opt->script_name, f, 1, opt); + tree = load_file(parser, opt->script_name, 1, opt); } ruby_set_script_name(opt->script_name); if (dump & DUMP_BIT(yydebug)) { @@ -1713,7 +1704,7 @@ process_options(int argc, char **argv, ruby_cmdline_options_t *opt) { VALUE path = Qnil; if (!opt->e_script && strcmp(opt->script, "-")) { - path = rb_realpath_internal(Qnil, script_name, 1); + path = rb_realpath_internal(Qnil, opt->script_name, 1); } base_block = toplevel_context(toplevel_binding); iseq = rb_iseq_new_main(tree, opt->script_name, path, vm_block_iseq(base_block)); @@ -1752,6 +1743,7 @@ struct load_file_arg { VALUE parser; VALUE fname; int script; + int xflag; ruby_cmdline_options_t *opt; VALUE f; }; @@ -1769,6 +1761,7 @@ load_file_internal(VALUE argp_v) NODE *tree = 0; rb_encoding *enc; ID set_encoding; + int xflag = argp->xflag; argp->script = 0; CONST_ID(set_encoding, "set_encoding"); @@ -1784,9 +1777,11 @@ load_file_internal(VALUE argp_v) enc = rb_ascii8bit_encoding(); rb_funcall(f, set_encoding, 1, rb_enc_from_encoding(enc)); - if (opt->xflag) { + if (xflag || opt->xflag) { line_start--; search_shebang: + forbid_setid("-x"); + opt->xflag = FALSE; while (!NIL_P(line = rb_io_gets(f))) { line_start++; RSTRING_GETMEM(line, str, len); @@ -1879,8 +1874,7 @@ load_file_internal(VALUE argp_v) static VALUE open_load_file(VALUE fname_v, int *xflag) { - const char *fname = (fname_v = rb_str_encode_ospath(fname_v), - StringValueCStr(fname_v)); + const char *fname = StringValueCStr(fname_v); long flen = RSTRING_LEN(fname_v); VALUE f; int e; @@ -1981,14 +1975,15 @@ restore_load_file(VALUE arg) } static NODE * -load_file(VALUE parser, VALUE fname, VALUE f, int script, ruby_cmdline_options_t *opt) +load_file(VALUE parser, VALUE fname, int script, ruby_cmdline_options_t *opt) { struct load_file_arg arg; arg.parser = parser; arg.fname = fname; arg.script = script; arg.opt = opt; - arg.f = f; + arg.xflag = 0; + arg.f = open_load_file(rb_str_encode_ospath(fname), &arg.xflag); return (NODE *)rb_ensure(load_file_internal, (VALUE)&arg, restore_load_file, (VALUE)&arg); } @@ -2003,15 +1998,17 @@ rb_load_file(const char *fname) void * rb_load_file_str(VALUE fname_v) { - return rb_parser_load_file(rb_parser_new(), fname_v); + ruby_cmdline_options_t opt; + + return load_file(rb_parser_new(), fname_v, 0, cmdline_options_init(&opt)); } void * rb_parser_load_file(VALUE parser, VALUE fname_v) { ruby_cmdline_options_t opt; - VALUE f = open_load_file(fname_v, &cmdline_options_init(&opt)->xflag); - return load_file(parser, fname_v, f, 0, &opt); + + return load_file(parser, fname_v, 0, cmdline_options_init(&opt)); } /* @@ -2120,7 +2117,7 @@ init_ids(ruby_cmdline_options_t *opt) #undef forbid_setid static void -forbid_setid(const char *s, const ruby_cmdline_options_t *opt) +forbid_setid(const char *s, ruby_cmdline_options_t *opt) { if (opt->setids & 1) rb_raise(rb_eSecurityError, "no %s allowed while running setuid", s); |