From: Dmitry Shulga Date: January 20 2011 9:59am Subject: bzr commit into mysql-5.1 branch (Dmitry.Shulga:3564) Bug#57450 List-Archive: http://lists.mysql.com/commits/129262 X-Bug: 57450 Message-Id: <201101200959.p0K9gGrZ026182@rcsinet13.oracle.com> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="===============7037293852898722169==" --===============7037293852898722169== MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Content-Disposition: inline #At file:///Users/shulga/projects/mysql/mysql-5.1-bug57450/ based on revid:martin.hansson@stripped 3564 Dmitry Shulga 2011-01-20 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 test case was added into mysql.test. @ client/my_readline.h Data members error and truncated was added to LINE_BUFFER structure. These data members used instead of out parameters in functions batch_readline, intern_read_line. @ client/mysql.cc read_and_execute() was modified: set status.exit_status to 1 when a call to batch_readline() returns NULL and the error data member of LINE_BUFFER structure is not equal to zero. @ client/readline.cc intern_read_line() was modified: cancel reading from input if fill_buffer() returns -1, e.g. if call to read failed. batch_readline was modified: set the error data member of LINE_BUFFER structure to value of my_errno when system error happened during call to my_read/my_realloc. @ mysql-test/t/mysql.test Test for bug#57450 was added. 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-20 09:58:46 +0000 @@ -25,9 +25,11 @@ typedef struct st_line_buffer uint eof; ulong max_size; ulong read_length; /* Length of last read string */ + int error; + bool truncated; } 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); extern void batch_readline_end(LINE_BUFFER *buffer); === modified file 'client/mysql.cc' --- a/client/mysql.cc 2010-11-26 13:57:59 +0000 +++ b/client/mysql.cc 2011-01-20 09:58:46 +0000 @@ -1872,14 +1872,13 @@ static int read_and_execute(bool interac ulong line_number=0; bool ml_comment= 0; COMMANDS *com; - bool truncated= 0; status.exit_status=1; for (;;) { if (!interactive) { - line=batch_readline(status.line_buff, &truncated); + line=batch_readline(status.line_buff); /* Skip UTF8 Byte Order Marker (BOM) 0xEFBBBF. Editors like "notepad" put this marker in @@ -1953,9 +1952,13 @@ static int read_and_execute(bool interac if (opt_outfile && line) fprintf(OUTFILE, "%s\n", line); } - if (!line) // End of file + // End of file or system error + if (!line) { - status.exit_status=0; + if (status.line_buff->error) + status.exit_status= 1; + else + status.exit_status= 0; break; } @@ -1976,7 +1979,8 @@ static int read_and_execute(bool interac #endif continue; } - if (add_line(glob_buffer,line,&in_string,&ml_comment, truncated)) + if (add_line(glob_buffer,line,&in_string,&ml_comment, + status.line_buff->truncated)) break; } /* if in batch mode, send last query even if it doesn't end with \g or go */ === modified file 'client/readline.cc' --- a/client/readline.cc 2009-03-18 08:27:49 +0000 +++ b/client/readline.cc 2011-01-20 09:58:46 +0000 @@ -24,7 +24,7 @@ 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); LINE_BUFFER *batch_readline_init(ulong max_size,FILE *file) @@ -42,13 +42,12 @@ LINE_BUFFER *batch_readline_init(ulong m } -char *batch_readline(LINE_BUFFER *line_buff, bool *truncated) +char *batch_readline(LINE_BUFFER *line_buff) { 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))) return 0; if (out_length && pos[out_length-1] == '\n') if (--out_length && pos[out_length-1] == '\r') /* Remove '\n' */ @@ -162,7 +161,10 @@ 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; + { + buffer->error= my_errno; + return (size_t) -1; + } buffer->start_of_line=buffer->buffer+start_offset; buffer->end=buffer->buffer+bufbytes; } @@ -177,7 +179,10 @@ static size_t fill_buffer(LINE_BUFFER *b /* Read in new stuff. */ if ((read_count= my_read(buffer->file, (uchar*) buffer->end, read_count, MYF(MY_WME))) == MY_FILE_ERROR) + { + buffer->error= my_errno; return (size_t) -1; + } DBUG_PRINT("fill_buff", ("Got %lu bytes", (ulong) read_count)); @@ -199,7 +204,7 @@ 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) { char *pos; size_t length; @@ -214,22 +219,25 @@ 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 NULL on EOF (in which case we abort), + on error, 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) + DBUG_RETURN(NULL); else continue; pos--; /* break line here */ - *truncated= 1; + buffer->truncated= 1; } else - *truncated= 0; + buffer->truncated= 0; buffer->end_of_line=pos+1; *out_length=(ulong) (pos + 1 - buffer->eof - buffer->start_of_line); DBUG_RETURN(buffer->start_of_line); === modified file 'mysql-test/t/mysql.test' --- a/mysql-test/t/mysql.test 2010-12-01 06:55:31 +0000 +++ b/mysql-test/t/mysql.test 2011-01-20 09:58:46 +0000 @@ -555,5 +555,11 @@ DROP DATABASE connected_db; --remove_file $MYSQLTEST_VARDIR/tmp/one_db_1.sql --remove_file $MYSQLTEST_VARDIR/tmp/one_db_2.sql +# +# 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 --===============7037293852898722169== 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\ # 3c4sft09ey8471av # target_branch: file:///Users/shulga/projects/mysql/mysql-5.1-\ # bug57450/ # testament_sha1: 721e37c6a94cfb21fd410bdbb03738b42aedb517 # timestamp: 2011-01-20 15:59:03 +0600 # base_revision_id: martin.hansson@stripped\ # h4k1n2nncwf47cks # # Begin bundle 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 xdyRThQkBPTS0IA= --===============7037293852898722169==--