diff options
author | matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2004-10-19 10:25:23 +0000 |
---|---|---|
committer | matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2004-10-19 10:25:23 +0000 |
commit | 860bdc3b61dbcacecd4a2fb2c40cf222e91b8fd5 (patch) | |
tree | 280c20d9eec8f2500428b71e7beeeff064ad5314 /io.c | |
parent | dd09dfe3f0bc975db4b84a0e563bcdf862a7063b (diff) |
* io.c (read_all): block string buffer modification during
rb_io_fread() by freezing it temporarily. [ruby-dev:24479]
* dir.c (rb_push_glob): block call at once the end of method.
[ruby-dev:24487]
* ext/enumerator/enumerator.c (enum_each_slice): remove
rb_gc_force_recycle() to prevent potential SEGV.
[ruby-dev:24499]
* ext/zlib/zlib.c (zstream_expand_buffer): hide internal string
buffer by clearing klass. [ruby-dev:24510]
* ext/socket/socket.c (sock_s_getservbyaname): protocol string
might be altered. [ruby-dev:24503]
* string.c (rb_str_upto): check if return value from succ is a
string. [ruby-dev:24504]
* io.c (rb_io_popen): get mode string via rb_io_flags_mode() to
avoid mode string modification. [ruby-dev:24454]
* io.c (rb_io_getline_fast): should take delim as unsigned char to
distinguish EOF and '\377'. [ruby-dev:24460]
* io.c (rb_io_getline): add check for RS modification.
[ruby-dev:24461]
* enum.c (enum_sort_by): use qsort() directly instead using
rb_iterate(). [ruby-dev:24462]
* enum.c (enum_each_with_index): remove rb_gc_force_recycle() to
prevent access to recycled object (via continuation for
example). [ruby-dev:24463]
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_8@7071 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'io.c')
-rw-r--r-- | io.c | 36 |
1 files changed, 24 insertions, 12 deletions
@@ -941,6 +941,7 @@ rb_io_fread(ptr, len, f) if (len > n) { clearerr(f); } + rb_thread_wait_fd(fileno(f)); } if (len == n) return 0; } @@ -994,7 +995,6 @@ read_all(fptr, siz, str) long bytes = 0; long n; - READ_CHECK(fptr->f); if (siz == 0) siz = BUFSIZ; if (NIL_P(str)) { str = rb_tainted_str_new(0, siz); @@ -1004,7 +1004,10 @@ read_all(fptr, siz, str) rb_str_resize(str, siz); } for (;;) { + FL_SET(str, FL_FREEZE); + READ_CHECK(fptr->f); n = rb_io_fread(RSTRING(str)->ptr+bytes, siz-bytes, fptr->f); + FL_UNSET(str, FL_FREEZE); if (n == 0 && bytes == 0) { rb_str_resize(str,0); if (!fptr->f) break; @@ -1232,7 +1235,7 @@ swallow(fptr, term) static VALUE rb_io_getline_fast(fptr, delim) OpenFile *fptr; - int delim; + unsigned char delim; { VALUE str = Qnil; int c; @@ -1248,6 +1251,17 @@ rb_io_getline_fast(fptr, delim) return str; } +static int +rscheck(rsptr, rslen, rs) + char *rsptr; + long rslen; + VALUE rs; +{ + if (RSTRING(rs)->ptr != rsptr && RSTRING(rs)->len != rslen) + rb_raise(rb_eRuntimeError, "rs modified"); + return 1; +} + static VALUE rb_io_getline(rs, fptr) VALUE rs; @@ -1287,6 +1301,7 @@ rb_io_getline(rs, fptr) while ((c = appendline(fptr, newline, &str)) != EOF && (c != newline || RSTRING(str)->len < rslen || + (rspara || rscheck(rsptr,rslen,rs)) || memcmp(RSTRING(str)->ptr+RSTRING(str)->len-rslen,rsptr,rslen))); if (rspara) { @@ -2148,9 +2163,8 @@ rb_io_binmode(io) } char* -rb_io_flags_mode(flags, mode) +rb_io_flags_mode(flags) int flags; - char *mode; { #ifdef O_BINARY # define MODE_BINMODE(a,b) ((flags & FMODE_BINMODE) ? (b) : (a)) @@ -2234,6 +2248,9 @@ rb_io_modenum_flags(mode) if (mode & O_APPEND) { flags |= FMODE_APPEND; } + if (mode & O_CREAT) { + flags |= FMODE_CREATE; + } #ifdef O_BINARY if (mode & O_BINARY) { flags |= FMODE_BINMODE; @@ -2407,13 +2424,12 @@ rb_file_open_internal(io, fname, mode) const char *fname, *mode; { OpenFile *fptr; - char mbuf[MODENUM_MAX]; MakeOpenFile(io, fptr); fptr->mode = rb_io_mode_flags(mode); fptr->path = strdup(fname); - fptr->f = rb_fopen(fptr->path, rb_io_flags_mode(fptr->mode, mbuf)); + fptr->f = rb_fopen(fptr->path, rb_io_flags_mode(fptr->mode)); return io; } @@ -2708,7 +2724,6 @@ rb_io_popen(str, argc, argv, klass) { char *mode; VALUE pname, pmode, port; - char mbuf[MODENUM_MAX]; if (rb_scan_args(argc, argv, "11", &pname, &pmode) == 1) { mode = "r"; @@ -2717,9 +2732,7 @@ rb_io_popen(str, argc, argv, klass) mode = rb_io_modenum_mode(FIX2INT(pmode)); } else { - strncpy(mbuf, StringValuePtr(pmode), sizeof(mbuf) - 1); - mbuf[sizeof(mbuf) - 1] = 0; - mode = mbuf; + mode = rb_io_flags_mode(rb_io_mode_flags(StringValuePtr(pmode))); } SafeStringValue(pname); port = pipe_open(str, mode); @@ -3982,7 +3995,7 @@ next_argv() if (binmode) rb_io_binmode(current_file); } else { - init_p = 0; + next_p = 1; return Qfalse; } } @@ -4945,7 +4958,6 @@ argf_read(argc, argv) retry: if (!next_argv()) { - if (NIL_P(str)) return rb_str_new(0,0); return str; } if (TYPE(current_file) != T_FILE) { |