From: Dmitry Shulga Date: December 3 2010 11:49am Subject: bzr commit into mysql-5.1-bugteam branch (Dmitry.Shulga:3521) Bug#57450 List-Archive: http://lists.mysql.com/commits/125930 X-Bug: 57450 Message-Id: <201012031151.oB2N71Fv004104@acsinet15.oracle.com> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="===============2100557901==" --===============2100557901== 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-03 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-03 11:49:35 +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,15 @@ 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; + int input_fd; + + input_fd= fileno(file); + + if (my_fstat(input_fd, &input_file_stat, MYF(0)) || + (input_file_stat.st_mode & S_IFDIR)) + return 0; + if (!(line_buff=(LINE_BUFFER*) my_malloc(sizeof(*line_buff),MYF(MY_WME | MY_ZEROFILL)))) return 0; @@ -177,8 +187,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 (errno != EAGAIN && errno != EINTR) + buffer->eof= 1; return (size_t) -1; - + } DBUG_PRINT("fill_buff", ("Got %lu bytes", (ulong) read_count)); if (!read_count) @@ -222,6 +239,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; --===============2100557901== 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\ # 61194x7wc1b27nqf # target_branch: file:///Users/shulga/projects/mysql/5.1-bugteam-\ # bug57450/ # testament_sha1: 94e3eb559486f9666698e360c7fb3c550f137247 # timestamp: 2010-12-03 17:49:51 +0600 # base_revision_id: azundris@stripped # # Begin bundle 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 faIIgA== --===============2100557901==--