summaryrefslogtreecommitdiff
path: root/sql/sql_bootstrap.cc
diff options
context:
space:
mode:
Diffstat (limited to 'sql/sql_bootstrap.cc')
-rw-r--r--sql/sql_bootstrap.cc39
1 files changed, 30 insertions, 9 deletions
diff --git a/sql/sql_bootstrap.cc b/sql/sql_bootstrap.cc
index c5e88739df7..8e632a02ace 100644
--- a/sql/sql_bootstrap.cc
+++ b/sql/sql_bootstrap.cc
@@ -14,24 +14,34 @@
51 Franklin Street, Suite 500, Boston, MA 02110-1335 USA */
+#include <stdlib.h>
+#include <errno.h>
#include <ctype.h>
#include <string.h>
#include "sql_bootstrap.h"
int read_bootstrap_query(char *query, int *query_length,
- fgets_input_t input, fgets_fn_t fgets_fn)
+ fgets_input_t input, fgets_fn_t fgets_fn, int *error)
{
char line_buffer[MAX_BOOTSTRAP_LINE_SIZE];
const char *line;
int len;
int query_len= 0;
+ int fgets_error= 0;
+ *error= 0;
for ( ; ; )
{
- line= (*fgets_fn)(line_buffer, sizeof(line_buffer), input);
+ line= (*fgets_fn)(line_buffer, sizeof(line_buffer), input, &fgets_error);
+
+ if (error)
+ *error= fgets_error;
+ if (fgets_error != 0)
+ return READ_BOOTSTRAP_ERROR;
+
if (line == NULL)
- return (query_len ? READ_BOOTSTRAP_ERROR : READ_BOOTSTRAP_EOF);
+ return (query_len == 0) ? READ_BOOTSTRAP_EOF : READ_BOOTSTRAP_ERROR;
len= strlen(line);
@@ -67,10 +77,22 @@ int read_bootstrap_query(char *query, int *query_length,
if (strncmp(line, "delimiter", 9) == 0)
continue;
- /* Append the current line to a multi line query. */
-
+ /* Append the current line to a multi line query. If the new line will make
+ the query too long, preserve the partial line to provide context for the
+ error message.
+ */
if (query_len + len + 1 >= MAX_BOOTSTRAP_QUERY_SIZE)
- return READ_BOOTSTRAP_ERROR;
+ {
+ int new_len= MAX_BOOTSTRAP_QUERY_SIZE - query_len - 1;
+ if ((new_len > 0) && (query_len < MAX_BOOTSTRAP_QUERY_SIZE))
+ {
+ memcpy(query + query_len, line, new_len);
+ query_len+= new_len;
+ }
+ query[query_len]= '\0';
+ *query_length= query_len;
+ return READ_BOOTSTRAP_QUERY_SIZE;
+ }
if (query_len != 0)
{
@@ -78,8 +100,7 @@ int read_bootstrap_query(char *query, int *query_length,
Append a \n to the current line, if any,
to preserve the intended presentation.
*/
- query[query_len]= '\n';
- query_len++;
+ query[query_len++]= '\n';
}
memcpy(query + query_len, line, len);
query_len+= len;
@@ -92,7 +113,7 @@ int read_bootstrap_query(char *query, int *query_length,
*/
query[query_len]= '\0';
*query_length= query_len;
- return 0;
+ return READ_BOOTSTRAP_SUCCESS;
}
}
}