[#24536] 「Rubyの落し方」 v.s. ruby_1_8 — akira yamada / やまだあきら <akira@...>

<URL:http://jp.rubyist.net/magazine/?0002-RubyCore>

40 messages 2004/10/20
[#24541] Re: 「Rubyの落し方」 v.s. ruby_1_8 — Yukihiro Matsumoto <matz@...> 2004/10/20

まつもと ゆきひろです

[#24599] 1.8.2 preview3? — akira yamada / やまだあきら <akira@...> 2004/10/26

2004-10-20 (水) の 21:38 +0900 に Yukihiro Matsumoto さんは書きました:

[#24605] Re: 1.8.2 preview3? — akira yamada / やまだあきら <akira@...> 2004/10/27

2004-10-26 (火) の 16:16 +0900 に akira yamada / やまだあきら さんは書きました:

[#24606] Re: 1.8.2 preview3? — Yukihiro Matsumoto <matz@...> 2004/10/27

まつもと ゆきひろです

[#24608] Re: 1.8.2 preview3? — akira yamada / やまだあきら <akira@...> 2004/10/27

2004-10-27 (水) の 11:48 +0900 に Yukihiro Matsumoto さんは書きました:

[#24620] Re: 1.8.2 preview3? — akira yamada / やまだあきら <akira@...> 2004/10/27

2004-10-27 (水) の 12:42 +0900 に akira yamada / やまだあきら さんは書きました:

[#24629] Re: 1.8.2 preview3? — Tanaka Akira <akr@...17n.org> 2004/10/29

In article <1098888819.9446.14.camel@rice.p.arika.org>,

[ruby-dev:24459] Re: open dumps core again

From: nobu@...
Date: 2004-10-09 03:59:03 UTC
List: ruby-dev #24459
なかだです。

At Fri, 8 Oct 2004 23:59:38 +0900,
Tanaka Akira wrote in [ruby-dev:24454]:
> 次のようにすると core を吐きます。
> 
> % ./ruby -e '
> mode = "r" + "\0"*0x20000
> n = 0
> str = Object.new
> class << str; self end.send(:define_method, :to_str) {
>   n += 1
>   mode.replace "" if n == 2
>   "|echo a"
> }
> p open(str, mode).read'

modenumを渡すようにしてみました。


Index: io.c
===================================================================
RCS file: /cvs/ruby/src/ruby/io.c,v
retrieving revision 1.301
diff -U2 -p -d -r1.301 io.c
--- io.c	7 Oct 2004 05:54:28 -0000	1.301
+++ io.c	9 Oct 2004 03:57:41 -0000
@@ -2542,10 +2542,11 @@ static VALUE
 rb_file_open_internal(io, fname, mode)
     VALUE io;
-    const char *fname, *mode;
+    const char *fname;
+    int mode;
 {
     OpenFile *fptr;
 
     MakeOpenFile(io, fptr);
-    fptr->mode = rb_io_mode_flags(mode);
+    fptr->mode = rb_io_modenum_flags(mode);
     fptr->path = strdup(fname);
     fptr->f = rb_fopen(fptr->path, rb_io_flags_mode(fptr->mode));
@@ -2558,5 +2559,6 @@ rb_file_open(fname, mode)
     const char *fname, *mode;
 {
-    return rb_file_open_internal(io_alloc(rb_cFile), fname, mode);
+    return rb_file_open_internal(io_alloc(rb_cFile), fname,
+				 rb_io_mode_modenum(mode));
 }
 
@@ -2732,10 +2734,11 @@ popen_exec(p)
 
 static VALUE
-pipe_open(argc, argv, pname, mode)
+pipe_open(argc, argv, pname, openmode)
     int argc;
     VALUE *argv;
-    char *pname, *mode;
+    char *pname;
+    int openmode;
 {
-    int modef = rb_io_mode_flags(mode);
+    int modef = rb_io_modenum_flags(openmode);
     int pid = 0;
     OpenFile *fptr;
@@ -2747,5 +2750,4 @@ pipe_open(argc, argv, pname, mode)
 #elif defined(_WIN32)
     FILE *fpr, *fpw;
-    int openmode = rb_io_mode_modenum(mode);
     char *prog = NULL;
 #endif
@@ -2838,5 +2840,5 @@ pipe_open(argc, argv, pname, mode)
 	cmd = StringValuePtr(arg0);
     }
-    fpr = popen(cmd, mode);
+    fpr = popen(cmd, rb_io_modenum_mode(mode));
 
     if (!fpr) rb_sys_fail(pname);
@@ -2871,15 +2873,15 @@ rb_io_popen(str, argc, argv, klass)
     VALUE klass;
 {
-    char *mode;
+    int mode;
     VALUE pname, pmode, port;
 
     if (rb_scan_args(argc, argv, "11", &pname, &pmode) == 1) {
-	mode = "r";
+	mode = O_RDONLY;
     }
     else if (FIXNUM_P(pmode)) {
-	mode = rb_io_modenum_mode(FIX2INT(pmode));
+	mode = FIX2INT(pmode);
     }
     else {
-	mode = StringValuePtr(pmode);
+	mode = rb_io_mode_modenum(StringValuePtr(pmode));
     }
     SafeStringValue(pname);
@@ -2957,18 +2959,15 @@ rb_io_s_popen(argc, argv, klass)
     VALUE klass;
 {
-    char *mode;
+    int mode;
     VALUE pname, pmode, port, tmp;
-    char mbuf[MODENUM_MAX];
 
     if (rb_scan_args(argc, argv, "11", &pname, &pmode) == 1) {
-	mode = "r";
+	mode = O_RDONLY;
     }
     else if (FIXNUM_P(pmode)) {
-	mode = rb_io_modenum_mode(FIX2INT(pmode));
+	mode = FIX2INT(pmode);
     }
     else {
-	strncpy(mbuf, StringValuePtr(pmode), sizeof(mbuf) - 1);
-	mbuf[sizeof(mbuf) - 1] = 0;
-	mode = mbuf;
+	mode = rb_io_mode_modenum(StringValuePtr(pmode));
     }
     tmp = rb_check_array_type(pname);
@@ -3008,5 +3007,4 @@ rb_open_file(argc, argv, io)
 {
     VALUE fname, vmode, perm;
-    char *mode;
     int flags, fmode;
 
@@ -3014,19 +3012,20 @@ rb_open_file(argc, argv, io)
     FilePathValue(fname);
 
+    if (NIL_P(vmode)) {
+	flags = O_RDONLY;
+    }
+    else if (FIXNUM_P(vmode)) {
+	flags = FIX2INT(vmode);
+    }
+    else {
+	SafeStringValue(vmode);
+	flags = rb_io_mode_modenum(RSTRING(vmode)->ptr);
+    }
     if (FIXNUM_P(vmode) || !NIL_P(perm)) {
-	if (FIXNUM_P(vmode)) {
-	    flags = FIX2INT(vmode);
-	}
-	else {
-	    SafeStringValue(vmode);
-	    flags = rb_io_mode_modenum(RSTRING(vmode)->ptr);
-	}
 	fmode = NIL_P(perm) ? 0666 :  NUM2INT(perm);
-
 	rb_file_sysopen_internal(io, RSTRING(fname)->ptr, flags, fmode);
     }
     else {
-	mode = NIL_P(vmode) ? "r" : StringValuePtr(vmode);
-	rb_file_open_internal(io, RSTRING(fname)->ptr, mode);
+	rb_file_open_internal(io, RSTRING(fname)->ptr, flags);
     }
     return io;
@@ -3211,5 +3210,6 @@ rb_f_open(argc, argv)
 static VALUE
 rb_io_open(fname, mode)
-    char *fname, *mode;
+    char *fname;
+    int mode;
 {
     if (fname[0] == '|') {
@@ -3217,5 +3217,5 @@ rb_io_open(fname, mode)
     }
     else {
-	return rb_file_open(fname, mode);
+	return rb_file_open(fname, rb_io_modenum_mode(mode));
     }
 }
@@ -4178,5 +4178,5 @@ next_argv()
 			str = rb_str_new2(fn);
 #ifdef NO_LONG_FNAME
-                        ruby_add_suffix(str, ruby_inplace_mode);
+			ruby_add_suffix(str, ruby_inplace_mode);
 #else
 			rb_str_cat2(str, ruby_inplace_mode);
@@ -4439,5 +4439,5 @@ rb_f_backquote(obj, str)
 
     SafeStringValue(str);
-    port = pipe_open(0, 0, RSTRING(str)->ptr, "r");
+    port = pipe_open(0, 0, RSTRING(str)->ptr, O_RDONLY);
     if (NIL_P(port)) return rb_str_new(0,0);
 
@@ -5010,5 +5010,5 @@ rb_io_s_foreach(argc, argv)
 	arg.sep = rb_default_rs;
     }
-    io = rb_io_open(RSTRING(fname)->ptr, "r");
+    io = rb_io_open(RSTRING(fname)->ptr, O_RDONLY);
     if (NIL_P(io)) return Qnil;
     GetOpenFile(io, fptr);
@@ -5050,5 +5050,5 @@ rb_io_s_readlines(argc, argv, io)
     FilePathValue(fname);
     arg.argc = argc - 1;
-    arg.io = rb_io_open(RSTRING(fname)->ptr, "r");
+    arg.io = rb_io_open(RSTRING(fname)->ptr, O_RDONLY);
     if (NIL_P(arg.io)) return Qnil;
     return rb_ensure(io_s_readlines, (VALUE)&arg, rb_io_close, arg.io);
@@ -5087,5 +5087,5 @@ rb_io_s_read(argc, argv, io)
     FilePathValue(fname);
     arg.argc = argc ? 1 : 0;
-    arg.io = rb_io_open(RSTRING(fname)->ptr, "r");
+    arg.io = rb_io_open(RSTRING(fname)->ptr, O_RDONLY);
     if (NIL_P(arg.io)) return Qnil;
     if (!NIL_P(offset)) {


-- 
--- 僕の前にBugはない。
--- 僕の後ろにBugはできる。
    中田 伸悦

In This Thread