From: Dmitry Shulga Date: December 8 2010 5:50pm Subject: bzr commit into mysql-5.1-bugteam branch (Dmitry.Shulga:3521) Bug#57450 List-Archive: http://lists.mysql.com/commits/126352 X-Bug: 57450 Message-Id: <201012081751.oB8BNi72004427@rcsinet15.oracle.com> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="===============1658776269==" --===============1658776269== 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 17:50:51 +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,13 @@ 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_IFDIR) == MY_S_IFDIR) || + ((input_file_stat.st_mode & MY_S_IFBLK) == MY_S_IFBLK)) + return 0; + if (!(line_buff=(LINE_BUFFER*) my_malloc(sizeof(*line_buff),MYF(MY_WME | MY_ZEROFILL)))) return 0; @@ -177,8 +185,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 +237,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; --===============1658776269== 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\ # kc2clqx9uu4hg5ol # target_branch: file:///Users/shulga/projects/mysql/5.1-bugteam-\ # bug57450/ # testament_sha1: d9631da5b91368cf95f09872b2aa1a3308928c37 # timestamp: 2010-12-08 23:50:59 +0600 # base_revision_id: azundris@stripped # # Begin bundle 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 woSHPqJDmA== --===============1658776269==--