ruby-changes:22067
From: nobu <ko1@a...>
Date: Sat, 24 Dec 2011 10:56:48 +0900 (JST)
Subject: [ruby-changes:22067] nobu:r34116 (trunk): * ext/readline/readline.c (readline_readline): check if outstream
nobu 2011-12-24 10:56:36 +0900 (Sat, 24 Dec 2011) New Revision: 34116 http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=34116 Log: * ext/readline/readline.c (readline_readline): check if outstream is closed to get rid of a bug of readline 6. [ruby-dev:45043] [Bug #5803] Modified files: trunk/ChangeLog trunk/ext/readline/readline.c trunk/test/readline/test_readline.rb Index: ChangeLog =================================================================== --- ChangeLog (revision 34115) +++ ChangeLog (revision 34116) @@ -1,3 +1,9 @@ +Sat Dec 24 10:56:32 2011 Nobuyoshi Nakada <nobu@r...> + + * ext/readline/readline.c (readline_readline): check if outstream + is closed to get rid of a bug of readline 6. [ruby-dev:45043] + [Bug #5803] + Sat Dec 24 06:59:49 2011 Nobuyoshi Nakada <nobu@r...> * test/readline/test_readline.rb (test_line_buffer__point): use Index: ext/readline/readline.c =================================================================== --- ext/readline/readline.c (revision 34115) +++ ext/readline/readline.c (revision 34116) @@ -40,6 +40,10 @@ #include <unistd.h> #endif +#ifdef HAVE_SYS_STAT_H +#include <sys/stat.h> +#endif + static VALUE mReadline; #define EDIT_LINE_LIBRARY_VERSION "EditLine wrapper" @@ -372,6 +376,13 @@ } if (!isatty(fileno(rl_instream)) && errno == EBADF) rb_raise(rb_eIOError, "closed stdin"); + if (rl_outstream) { + struct stat stbuf; + int fd = fileno(rl_outstream); + if (fd < 0 || fstat(fd, &stbuf) != 0) { + rb_raise(rb_eIOError, "closed stdout"); + } + } #ifdef _WIN32 rl_prep_terminal(1); Index: test/readline/test_readline.rb =================================================================== --- test/readline/test_readline.rb (revision 34115) +++ test/readline/test_readline.rb (revision 34116) @@ -303,6 +303,16 @@ end end + def test_closed_outstream + bug5803 = '[ruby-dev:45043]' + IO.pipe do |r, w| + Readline.input = r + Readline.output = w + (w << "##\t").close + assert_raise(IOError, bug5803) {Readline.readline} + end + end + private def replace_stdio(stdin_path, stdout_path) -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/