From: Dmitry Shulga Date: January 12 2011 4:13pm Subject: bzr commit into mysql-5.1-bugteam branch (Dmitry.Shulga:3521) Bug#57450 List-Archive: http://lists.mysql.com/commits/128543 X-Bug: 57450 Message-Id: <201101121613.p0C48JAr031577@acsinet15.oracle.com> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="===============8837925787200698580==" --===============8837925787200698580== MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Content-Disposition: inline #At file:///Users/shulga/projects/mysql/5.1-bugteam-bug57450/ based on revid:azundris@stripped 3521 Dmitry Shulga 2011-01-12 Fixed bug#57450 - mysql client enter in an infinite loop if the standard input is a directory. The problem is that mysql monitor try to read from stdin without checking input source type. The solution is to stop reading data from standard input if a call to read(2) failed. A new output parameter was introduced into functions batch_readline() and intern_read_line() in order to differentiate between cases of getting EOF and getting error on standard input. A new test case was added into mysql.test. @ client/my_readline.h Added third output parameter into batch_readline. @ client/mysql.cc read_and_execute() was modified: set status.exit_status to 1 when a call to batch_readline() returns NULL and valriable have_sys_err is true. @ client/readline.cc intern_read_line() was modified: cancel reading from input if fill_buffer() returns -1, e.g. if call to read failed. modified: client/my_readline.h client/mysql.cc client/readline.cc mysql-test/t/mysql.test === modified file 'client/my_readline.h' --- a/client/my_readline.h 2009-03-18 08:27:49 +0000 +++ b/client/my_readline.h 2011-01-12 16:12:53 +0000 @@ -29,5 +29,6 @@ typedef struct st_line_buffer extern LINE_BUFFER *batch_readline_init(ulong max_size,FILE *file); extern LINE_BUFFER *batch_readline_command(LINE_BUFFER *buffer, char * str); -extern char *batch_readline(LINE_BUFFER *buffer, bool *truncated); +extern char *batch_readline(LINE_BUFFER *buffer, bool *truncated, + bool *have_sys_err); extern void batch_readline_end(LINE_BUFFER *buffer); === modified file 'client/mysql.cc' --- a/client/mysql.cc 2010-10-19 22:36:59 +0000 +++ b/client/mysql.cc 2011-01-12 16:12:53 +0000 @@ -1874,12 +1874,13 @@ static int read_and_execute(bool interac COMMANDS *com; bool truncated= 0; status.exit_status=1; - + bool have_sys_err= false; + for (;;) { if (!interactive) { - line=batch_readline(status.line_buff, &truncated); + line=batch_readline(status.line_buff, &truncated, &have_sys_err); /* Skip UTF8 Byte Order Marker (BOM) 0xEFBBBF. Editors like "notepad" put this marker in @@ -1953,9 +1954,12 @@ static int read_and_execute(bool interac if (opt_outfile && line) fprintf(OUTFILE, "%s\n", line); } - if (!line) // End of file + if (!line) // End of file or system error { - status.exit_status=0; + if (have_sys_err) + status.exit_status= 1; + else + status.exit_status= 0; break; } === modified file 'client/readline.cc' --- a/client/readline.cc 2009-03-18 08:27:49 +0000 +++ b/client/readline.cc 2011-01-12 16:12:53 +0000 @@ -24,7 +24,8 @@ static bool init_line_buffer(LINE_BUFFER ulong max_size); static bool init_line_buffer_from_string(LINE_BUFFER *buffer,char * str); static size_t fill_buffer(LINE_BUFFER *buffer); -static char *intern_read_line(LINE_BUFFER *buffer, ulong *out_length, bool *truncated); +static char *intern_read_line(LINE_BUFFER *buffer, ulong *out_length, + bool *truncated, bool *have_sys_err); LINE_BUFFER *batch_readline_init(ulong max_size,FILE *file) @@ -42,13 +43,15 @@ LINE_BUFFER *batch_readline_init(ulong m } -char *batch_readline(LINE_BUFFER *line_buff, bool *truncated) +char *batch_readline(LINE_BUFFER *line_buff, bool *truncated, + bool *have_sys_err) { char *pos; ulong out_length; DBUG_ASSERT(truncated != NULL); - if (!(pos=intern_read_line(line_buff,&out_length, truncated))) + if (!(pos=intern_read_line(line_buff,&out_length, truncated, + have_sys_err))) return 0; if (out_length && pos[out_length-1] == '\n') if (--out_length && pos[out_length-1] == '\r') /* Remove '\n' */ @@ -162,7 +165,7 @@ static size_t fill_buffer(LINE_BUFFER *b if (!(buffer->buffer = (char*) my_realloc(buffer->buffer, buffer->bufread+1, MYF(MY_WME | MY_FAE)))) - return (uint) -1; + return (size_t) -1; buffer->start_of_line=buffer->buffer+start_offset; buffer->end=buffer->buffer+bufbytes; } @@ -199,7 +202,8 @@ static size_t fill_buffer(LINE_BUFFER *b -char *intern_read_line(LINE_BUFFER *buffer, ulong *out_length, bool *truncated) +char *intern_read_line(LINE_BUFFER *buffer, ulong *out_length, + bool *truncated, bool *have_sys_err) { char *pos; size_t length; @@ -214,15 +218,21 @@ char *intern_read_line(LINE_BUFFER *buff if (pos == buffer->end) { /* - fill_buffer() can return 0 either on EOF in which case we abort - or when the internal buffer has hit the size limit. In the latter case - return what we have read so far and signal string truncation. + fill_buffer() can return 0 either on EOF (or if system error + was occurred) in which case we abort or when the internal + buffer has hit the size limit. In the latter case return what + we have read so far and signal string truncation. */ - if (!(length=fill_buffer(buffer)) || length == (uint) -1) + if (!(length=fill_buffer(buffer))) { if (buffer->eof) DBUG_RETURN(0); } + else if (length == (size_t) -1) + { + *have_sys_err= true; + DBUG_RETURN(0); + } else continue; pos--; /* break line here */ === modified file 'mysql-test/t/mysql.test' --- a/mysql-test/t/mysql.test 2009-12-17 20:06:36 +0000 +++ b/mysql-test/t/mysql.test 2011-01-12 16:12:53 +0000 @@ -412,5 +412,11 @@ drop table t1; --echo --exec $MYSQL --skip-column-names --vertical test -e "select 1 as a" +# +# Bug#57450: mysql client enter in an infinite loop if the standard input is a directory +# +--error 1 +--exec $MYSQL < . + --echo --echo End of tests --===============8837925787200698580== MIME-Version: 1.0 Content-Type: text/bzr-bundle; charset="us-ascii"; name="bzr/dmitry.shulga@stripped" Content-Transfer-Encoding: 7bit Content-Disposition: inline # Bazaar merge directive format 2 (Bazaar 0.90) # revision_id: dmitry.shulga@stripped\ # 1ffh08e6dxdul80f # target_branch: file:///Users/shulga/projects/mysql/5.1-bugteam-\ # bug57450/ # testament_sha1: 2e1e256b87a074603964d0295cd93f48c8c85b90 # timestamp: 2011-01-12 22:13:08 +0600 # base_revision_id: azundris@stripped # # Begin bundle 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 --===============8837925787200698580==--