summaryrefslogtreecommitdiff
path: root/io.c
diff options
context:
space:
mode:
authormatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2004-10-19 10:25:23 +0000
committermatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2004-10-19 10:25:23 +0000
commit860bdc3b61dbcacecd4a2fb2c40cf222e91b8fd5 (patch)
tree280c20d9eec8f2500428b71e7beeeff064ad5314 /io.c
parentdd09dfe3f0bc975db4b84a0e563bcdf862a7063b (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.c36
1 files changed, 24 insertions, 12 deletions
diff --git a/io.c b/io.c
index 1303cbe6bb..59dc9265c4 100644
--- a/io.c
+++ b/io.c
@@ -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) {