From: Dmitry Shulga Date: December 8 2010 9:42am Subject: bzr commit into mysql-5.1-bugteam branch (Dmitry.Shulga:3521) Bug#57450 List-Archive: http://lists.mysql.com/commits/126295 X-Bug: 57450 Message-Id: <201012080943.oB84T6TL030556@rcsinet15.oracle.com> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="===============0703294811==" --===============0703294811== 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 2010-12-08 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 for type of input source. The solution is to check if stdin's file descriptor related to directory and exit from program if this case is true. @ client/readline.cc batch_readline_init() was modified: added checking for file mode and returning from function if input stream is a directory. fill_buffer() and intern_read_line() was modified: doesn't set eof flag if read failed with temporal error and try repeat this failed syscall. modified: client/readline.cc === modified file 'client/readline.cc' --- a/client/readline.cc 2009-03-18 08:27:49 +0000 +++ b/client/readline.cc 2010-12-08 09:42:55 +0000 @@ -18,6 +18,7 @@ #include #include #include +#include #include "my_readline.h" static bool init_line_buffer(LINE_BUFFER *buffer,File file,ulong size, @@ -30,6 +31,12 @@ static char *intern_read_line(LINE_BUFFE LINE_BUFFER *batch_readline_init(ulong max_size,FILE *file) { LINE_BUFFER *line_buff; + MY_STAT input_file_stat; + + if (my_fstat(fileno(file), &input_file_stat, MYF(0)) || + !(input_file_stat.st_mode & (MY_S_IFREG|MY_S_IFIFO))) + return 0; + if (!(line_buff=(LINE_BUFFER*) my_malloc(sizeof(*line_buff),MYF(MY_WME | MY_ZEROFILL)))) return 0; @@ -177,8 +184,15 @@ 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) + { + /* + we don't set eof flag for this temporal errors because next + call to read may be successful. + */ + if (my_errno != EAGAIN && my_errno != EINTR) + buffer->eof= 1; return (size_t) -1; - + } DBUG_PRINT("fill_buff", ("Got %lu bytes", (ulong) read_count)); if (!read_count) @@ -222,6 +236,9 @@ char *intern_read_line(LINE_BUFFER *buff { if (buffer->eof) DBUG_RETURN(0); + // check if syscall read failed with temporal error. + else if (length == (uint) -1) + continue; } else continue; --===============0703294811== 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\ # ejs7y404kkha7szx # target_branch: file:///Users/shulga/projects/mysql/5.1-bugteam-\ # bug57450/ # testament_sha1: 7f91e13dcd93723a93e8f97448d16b89d4e0f5f8 # timestamp: 2010-12-08 15:43:03 +0600 # base_revision_id: azundris@stripped # # Begin bundle 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 JkA= --===============0703294811==--