1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00

* io.c (rb_f_open): create copy of popen specifier. [ruby-dev:24656]

* string.c (rb_str_locktmp): lock string temporarily.

* string.c (str_independent): add tmplock check.

* io.c (io_write): lock output string temporarily.
  [ruby-dev:24649]

* io.c (io_write): use rb_str_locktmp().

* io.c (read_all): ditto.


git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@7162 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
matz 2004-10-31 17:37:52 +00:00
parent b7e13d8677
commit 8db864c999
6 changed files with 73 additions and 70 deletions

View file

@ -1,3 +1,18 @@
Mon Nov 1 01:14:52 2004 Yukihiro Matsumoto <matz@ruby-lang.org>
* io.c (rb_f_open): create copy of popen specifier. [ruby-dev:24656]
* string.c (rb_str_locktmp): lock string temporarily.
* string.c (str_independent): add tmplock check.
* io.c (io_write): lock output string temporarily.
[ruby-dev:24649]
* io.c (io_write): use rb_str_locktmp().
* io.c (read_all): ditto.
Sun Oct 31 23:37:00 2004 NARUSE, Yui <naruse@ruby-lang.org> Sun Oct 31 23:37:00 2004 NARUSE, Yui <naruse@ruby-lang.org>
* process.c: on NetBSD don't use setruid() and setrgid(). * process.c: on NetBSD don't use setruid() and setrgid().

View file

@ -52,7 +52,7 @@ rb_ary_modify_check(ary)
{ {
if (OBJ_FROZEN(ary)) rb_error_frozen("array"); if (OBJ_FROZEN(ary)) rb_error_frozen("array");
if (FL_TEST(ary, ARY_TMPLOCK)) if (FL_TEST(ary, ARY_TMPLOCK))
rb_raise(rb_eTypeError, "can't modify array during iteration"); rb_raise(rb_eRuntimeError, "can't modify array during iteration");
if (!OBJ_TAINTED(ary) && rb_safe_level() >= 4) if (!OBJ_TAINTED(ary) && rb_safe_level() >= 4)
rb_raise(rb_eSecurityError, "Insecure: can't modify array"); rb_raise(rb_eSecurityError, "Insecure: can't modify array");
} }

View file

@ -418,6 +418,8 @@ VALUE rb_str_buf_cat2 _((VALUE, const char*));
VALUE rb_obj_as_string _((VALUE)); VALUE rb_obj_as_string _((VALUE));
VALUE rb_check_string_type _((VALUE)); VALUE rb_check_string_type _((VALUE));
VALUE rb_str_dup _((VALUE)); VALUE rb_str_dup _((VALUE));
VALUE rb_str_locktmp _((VALUE));
VALUE rb_str_unlocktmp _((VALUE));
VALUE rb_str_dup_frozen _((VALUE)); VALUE rb_str_dup_frozen _((VALUE));
VALUE rb_str_plus _((VALUE, VALUE)); VALUE rb_str_plus _((VALUE, VALUE));
VALUE rb_str_times _((VALUE, VALUE)); VALUE rb_str_times _((VALUE, VALUE));

89
io.c
View file

@ -473,7 +473,9 @@ io_write(io, str)
rb_io_check_writable(fptr); rb_io_check_writable(fptr);
f = GetWriteFile(fptr); f = GetWriteFile(fptr);
rb_str_locktmp(str);
n = rb_io_fwrite(RSTRING(str)->ptr, RSTRING(str)->len, f); n = rb_io_fwrite(RSTRING(str)->ptr, RSTRING(str)->len, f);
rb_str_unlocktmp(str);
if (n == -1L) rb_sys_fail(fptr->path); if (n == -1L) rb_sys_fail(fptr->path);
if (fptr->mode & FMODE_SYNC) { if (fptr->mode & FMODE_SYNC) {
io_fflush(f, fptr); io_fflush(f, fptr);
@ -1031,10 +1033,10 @@ read_all(fptr, siz, str)
rb_str_resize(str, siz); rb_str_resize(str, siz);
} }
for (;;) { for (;;) {
FL_SET(str, FL_FREEZE); rb_str_locktmp(str);
READ_CHECK(fptr->f); READ_CHECK(fptr->f);
n = rb_io_fread(RSTRING(str)->ptr+bytes, siz-bytes, fptr->f); n = rb_io_fread(RSTRING(str)->ptr+bytes, siz-bytes, fptr->f);
FL_UNSET(str, FL_FREEZE); rb_str_unlocktmp(str);
if (n == 0 && bytes == 0) { if (n == 0 && bytes == 0) {
rb_str_resize(str,0); rb_str_resize(str,0);
if (!fptr->f) break; if (!fptr->f) break;
@ -1212,10 +1214,10 @@ io_read(argc, argv, io)
} }
if (len == 0) return str; if (len == 0) return str;
FL_SET(str, FL_FREEZE); rb_str_locktmp(str);
READ_CHECK(fptr->f); READ_CHECK(fptr->f);
n = rb_io_fread(RSTRING(str)->ptr, len, fptr->f); n = rb_io_fread(RSTRING(str)->ptr, len, fptr->f);
FL_UNSET(str, FL_FREEZE); rb_str_unlocktmp(str);
if (n == 0) { if (n == 0) {
rb_str_resize(str,0); rb_str_resize(str,0);
if (!fptr->f) return Qnil; if (!fptr->f) return Qnil;
@ -2511,15 +2513,12 @@ rb_fopen(fname, mode)
const char *mode; const char *mode;
{ {
FILE *file; FILE *file;
char mbuf[MODENUM_MAX];
strncpy(mbuf, mode, sizeof(mbuf) - 1); file = fopen(fname, mode);
mbuf[sizeof(mbuf) - 1] = 0;
file = fopen(fname, mbuf);
if (!file) { if (!file) {
if (errno == EMFILE || errno == ENFILE) { if (errno == EMFILE || errno == ENFILE) {
rb_gc(); rb_gc();
file = fopen(fname, mbuf); file = fopen(fname, mode);
} }
if (!file) { if (!file) {
rb_sys_fail(fname); rb_sys_fail(fname);
@ -2776,7 +2775,7 @@ pipe_open(argc, argv, pname, mode)
int modef = rb_io_mode_flags(mode); int modef = rb_io_mode_flags(mode);
int pid = 0; int pid = 0;
OpenFile *fptr; OpenFile *fptr;
VALUE port, arg0; VALUE port, prog;
#if defined(HAVE_FORK) #if defined(HAVE_FORK)
int status; int status;
struct popen_arg arg; struct popen_arg arg;
@ -2786,17 +2785,20 @@ pipe_open(argc, argv, pname, mode)
int openmode = rb_io_mode_modenum(mode); int openmode = rb_io_mode_modenum(mode);
char *prog = NULL; char *prog = NULL;
#endif #endif
char *cmd = pname; char *cmd;
if (!pname) { if (!pname) {
arg0 = rb_check_argv(argc, argv); prog = rb_check_argv(argc, argv);
if (arg0) pname = StringValuePtr(arg0); if (!prog && argc == 1) {
cmd = pname; argc = 0;
if (!pname) pname = RSTRING(argv[0])->ptr; prog = argv[0];
} }
pname = StringValuePtr(prog);
}
cmd = pname;
#if defined(HAVE_FORK) #if defined(HAVE_FORK)
doexec = (argc > 0) || (strcmp("-", pname) != 0); doexec = (strcmp("-", pname) != 0);
if (!doexec) { if (!doexec) {
fflush(stdin); /* is it really needed? */ fflush(stdin); /* is it really needed? */
fflush(stdout); fflush(stdout);
@ -2871,8 +2873,8 @@ pipe_open(argc, argv, pname, mode)
#define PIPE_FDOPEN(i) (i?fpw:fpr) #define PIPE_FDOPEN(i) (i?fpw:fpr)
#else #else
if (argc > 0) { if (argc > 0) {
arg0 = rb_ary_join(rb_ary_new4(argc, argv), rb_str_new2(" ")); prog = rb_ary_join(rb_ary_new4(argc, argv), rb_str_new2(" "));
cmd = StringValuePtr(arg0); cmd = StringValuePtr(prog);
} }
fpr = popen(cmd, mode); fpr = popen(cmd, mode);
@ -2900,44 +2902,6 @@ pipe_open(argc, argv, pname, mode)
return port; return port;
} }
static VALUE
rb_io_popen(str, argc, argv, klass)
char *str;
int argc;
VALUE *argv;
VALUE klass;
{
char *mode;
VALUE pname, pmode, port;
if (rb_scan_args(argc, argv, "11", &pname, &pmode) == 1) {
mode = "r";
}
else if (FIXNUM_P(pmode)) {
mode = rb_io_modenum_mode(FIX2INT(pmode));
}
else {
mode = rb_io_flags_mode(rb_io_mode_flags(StringValuePtr(pmode)));
}
SafeStringValue(pname);
port = pipe_open(0, 0, str, mode);
if (NIL_P(port)) {
/* child */
if (rb_block_given_p()) {
rb_yield(Qnil);
fflush(stdout);
fflush(stderr);
_exit(0);
}
return Qnil;
}
RBASIC(port)->klass = klass;
if (rb_block_given_p()) {
return rb_ensure(rb_yield, port, io_close, port);
}
return port;
}
/* /*
* call-seq: * call-seq:
* IO.popen(cmd, mode="r") => io * IO.popen(cmd, mode="r") => io
@ -2995,7 +2959,6 @@ rb_io_s_popen(argc, argv, klass)
{ {
char *mode; char *mode;
VALUE pname, pmode, port, tmp; VALUE pname, pmode, port, tmp;
char mbuf[MODENUM_MAX];
if (rb_scan_args(argc, argv, "11", &pname, &pmode) == 1) { if (rb_scan_args(argc, argv, "11", &pname, &pmode) == 1) {
mode = "r"; mode = "r";
@ -3004,9 +2967,7 @@ rb_io_s_popen(argc, argv, klass)
mode = rb_io_modenum_mode(FIX2INT(pmode)); mode = rb_io_modenum_mode(FIX2INT(pmode));
} }
else { else {
strncpy(mbuf, StringValuePtr(pmode), sizeof(mbuf) - 1); mode = rb_io_flags_mode(rb_io_mode_flags(StringValuePtr(pmode)));
mbuf[sizeof(mbuf) - 1] = 0;
mode = mbuf;
} }
tmp = rb_check_array_type(pname); tmp = rb_check_array_type(pname);
if (!NIL_P(tmp)) { if (!NIL_P(tmp)) {
@ -3018,7 +2979,7 @@ rb_io_s_popen(argc, argv, klass)
} }
else { else {
SafeStringValue(pname); SafeStringValue(pname);
port = pipe_open(0, 0, RSTRING(pname)->ptr, mode); port = pipe_open(1, &pname, 0, mode);
if (NIL_P(port)) { if (NIL_P(port)) {
/* child */ /* child */
if (rb_block_given_p()) { if (rb_block_given_p()) {
@ -3237,7 +3198,9 @@ rb_f_open(argc, argv)
if (!NIL_P(tmp)) { if (!NIL_P(tmp)) {
char *str = StringValuePtr(tmp); char *str = StringValuePtr(tmp);
if (str && str[0] == '|') { if (str && str[0] == '|') {
return rb_io_popen(str+1, argc, argv, rb_cIO); argv[0] = rb_str_new(str+1, RSTRING(tmp)->len-1);
OBJ_INFECT(argv[0], tmp);
return rb_io_s_popen(argc, argv, rb_cIO);
} }
} }
} }
@ -4478,7 +4441,7 @@ rb_f_backquote(obj, str)
OpenFile *fptr; OpenFile *fptr;
SafeStringValue(str); SafeStringValue(str);
port = pipe_open(0, 0, RSTRING(str)->ptr, "r"); port = pipe_open(1, &str, 0, "r");
if (NIL_P(port)) return rb_str_new(0,0); if (NIL_P(port)) return rb_str_new(0,0);
GetOpenFile(port, fptr); GetOpenFile(port, fptr);

View file

@ -1260,14 +1260,17 @@ rb_f_exec(argc, argv)
prog = rb_check_argv(argc, argv); prog = rb_check_argv(argc, argv);
if (!prog && argc == 1) { if (!prog && argc == 1) {
--argc; e.argc = 0;
prog = *argv++; e.argv = 0;
e.prog = RSTRING(argv[0])->ptr;
} }
else {
e.argc = argc; e.argc = argc;
e.argv = argv; e.argv = argv;
e.prog = prog ? RSTRING(prog)->ptr : 0; e.prog = RSTRING(prog)->ptr;
}
rb_exec(&e); rb_exec(&e);
rb_sys_fail(prog ? e.prog : RSTRING(argv[0])->ptr); rb_sys_fail(e.prog);
return Qnil; /* dummy */ return Qnil; /* dummy */
} }

View file

@ -27,6 +27,7 @@
VALUE rb_cString; VALUE rb_cString;
#define STR_TMPLOCK FL_USER1
#define STR_ASSOC FL_USER3 #define STR_ASSOC FL_USER3
#define STR_NOCAPA (ELTS_SHARED|STR_ASSOC) #define STR_NOCAPA (ELTS_SHARED|STR_ASSOC)
@ -462,6 +463,9 @@ static int
str_independent(str) str_independent(str)
VALUE str; VALUE str;
{ {
if (FL_TEST(str, STR_TMPLOCK)) {
rb_raise(rb_eRuntimeError, "can't modify string; temporarily locked");
}
if (OBJ_FROZEN(str)) rb_error_frozen("string"); if (OBJ_FROZEN(str)) rb_error_frozen("string");
if (!OBJ_TAINTED(str) && rb_safe_level() >= 4) if (!OBJ_TAINTED(str) && rb_safe_level() >= 4)
rb_raise(rb_eSecurityError, "Insecure: can't modify string"); rb_raise(rb_eSecurityError, "Insecure: can't modify string");
@ -632,6 +636,22 @@ rb_str_dup_frozen(str)
return str; return str;
} }
VALUE
rb_str_locktmp(str)
VALUE str;
{
FL_SET(str, STR_TMPLOCK);
return str;
}
VALUE
rb_str_unlocktmp(str)
VALUE str;
{
FL_UNSET(str, STR_TMPLOCK);
return str;
}
VALUE VALUE
rb_str_resize(str, len) rb_str_resize(str, len)
VALUE str; VALUE str;