From: Dmitry Shulga Date: January 19 2011 1:32pm Subject: bzr commit into mysql-5.1-bugteam branch (Dmitry.Shulga:3521) Bug#57450 List-Archive: http://lists.mysql.com/commits/129190 X-Bug: 57450 Message-Id: <201101191334.p0JDCJjD015521@rcsinet13.oracle.com> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="===============1367930228672619868==" --===============1367930228672619868== 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-19 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-19 13:32:36 +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-10-19 22:36:59 +0000 +++ b/client/mysql.cc 2011-01-19 13:32:36 +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-19 13:32:36 +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 2009-12-17 20:06:36 +0000 +++ b/mysql-test/t/mysql.test 2011-01-19 13:32:36 +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 --===============1367930228672619868== 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\ # 652d12luy66vfjda # target_branch: file:///Users/shulga/projects/mysql/5.1-bugteam-\ # bug57450/ # testament_sha1: 1b426635f642f0bf5346a28500ce047ba93c3fb2 # timestamp: 2011-01-19 19:32:45 +0600 # base_revision_id: azundris@stripped # # Begin bundle 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 04gg --===============1367930228672619868==--