Commit 3841a370 authored by unknown's avatar unknown

Fix use of _cgets() to handle an input line that exceeds our buffer space

before a newline is found. (Bug #10840)


client/mysql.cc:
  Call _cgets() as many times as necessary to get the full line of input
parent f9a80b34
...@@ -931,6 +931,7 @@ static int read_lines(bool execute_commands) ...@@ -931,6 +931,7 @@ static int read_lines(bool execute_commands)
{ {
#if defined( __WIN__) || defined(OS2) || defined(__NETWARE__) #if defined( __WIN__) || defined(OS2) || defined(__NETWARE__)
char linebuffer[254]; char linebuffer[254];
String buffer;
#endif #endif
char *line; char *line;
char in_string=0; char in_string=0;
...@@ -972,9 +973,24 @@ static int read_lines(bool execute_commands) ...@@ -972,9 +973,24 @@ static int read_lines(bool execute_commands)
*p = '\0'; *p = '\0';
} }
#else #else
buffer.length(0);
/* _cgets() expects the buffer size - 3 as the first byte */ /* _cgets() expects the buffer size - 3 as the first byte */
linebuffer[0]= (char) sizeof(linebuffer) - 3; linebuffer[0]= (char) sizeof(linebuffer) - 3;
do
{
line= _cgets(linebuffer); line= _cgets(linebuffer);
buffer.append(line, (unsigned char)linebuffer[1]);
/*
If _cgets() gets an input line that is linebuffer[0] bytes
long, the next call to _cgets() will return immediately with
linebuffer[1] == 0, and it does the same thing for input that
is linebuffer[0]-1 bytes long. So it appears that even though
_cgets() replaces the newline (which is two bytes on Window) with
a nil, it still needs the space in the linebuffer for it. This is,
naturally, undocumented.
*/
} while (linebuffer[0] <= linebuffer[1] + 1);
line= buffer.c_ptr();
#endif /* __NETWARE__ */ #endif /* __NETWARE__ */
#else #else
if (opt_outfile) if (opt_outfile)
...@@ -1031,6 +1047,9 @@ static int read_lines(bool execute_commands) ...@@ -1031,6 +1047,9 @@ static int read_lines(bool execute_commands)
status.exit_status=0; status.exit_status=0;
} }
} }
#if defined( __WIN__) || defined(OS2) || defined(__NETWARE__)
buffer.free();
#endif
return status.exit_status; return status.exit_status;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment