diff options
author | Neeraj Bisht <neeraj.x.bisht@oracle.com> | 2014-05-15 15:50:52 +0530 |
---|---|---|
committer | Neeraj Bisht <neeraj.x.bisht@oracle.com> | 2014-05-15 15:50:52 +0530 |
commit | 10978e0aa9e3dca43cf26c2c63f46181483073af (patch) | |
tree | 6523f31cb4b043e7e5d01927934196ebb513c9d0 | |
parent | f22023351248e260743b6521c7795faf9e67a837 (diff) | |
download | mariadb-git-10978e0aa9e3dca43cf26c2c63f46181483073af.tar.gz |
Bug#18207212 : FILE NAME IS NOT ESCAPED IN BINLOG FOR LOAD DATA INFILE STATEMENT
Problem:
Load_log_event::print_query() function does not put escape character in file name
for "LOAD DATA INFILE" statement.
Analysis:
When we have "'" in our file name for "LOAD DATA INFILE" statement,
Load_log_event::print_query() function does not put escape character
in our file name.
This one result that when we show binary-log, we get file name without
escape character.
Solution:
To put escape character when we have "'" in file name, for this instead of using
simple memcpy() to put file-name, we will use pretty_print_str().
-rw-r--r-- | mysys/mf_iocache2.c | 9 | ||||
-rw-r--r-- | sql/log_event.cc | 14 |
2 files changed, 15 insertions, 8 deletions
diff --git a/mysys/mf_iocache2.c b/mysys/mf_iocache2.c index 04d2bc34ae4..1b0375cb88e 100644 --- a/mysys/mf_iocache2.c +++ b/mysys/mf_iocache2.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved. +/* Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -408,6 +408,13 @@ process_flags: if (my_b_write(info, (uchar*) par, length2)) goto err; } + else if (*fmt == 'c') /* char type parameter */ + { + char par[2]; + par[0] = va_arg(args, int); + if (my_b_write(info, (uchar*) par, 1)) + goto err; + } else if (*fmt == 'b') /* Sized buffer parameter, only precision makes sense */ { char *par = va_arg(args, char *); diff --git a/sql/log_event.cc b/sql/log_event.cc index fea7c863cbc..40e626f1083 100644 --- a/sql/log_event.cc +++ b/sql/log_event.cc @@ -4384,7 +4384,7 @@ uint Load_log_event::get_query_buffer_length() return //the DB name may double if we escape the quote character 5 + 2*db_len + 3 + - 18 + fname_len + 2 + // "LOAD DATA INFILE 'file''" + 18 + fname_len*4 + 2 + // "LOAD DATA INFILE 'file''" 11 + // "CONCURRENT " 7 + // LOCAL 9 + // " REPLACE or IGNORE " @@ -4430,9 +4430,9 @@ void Load_log_event::print_query(bool need_db, const char *cs, char *buf, if (check_fname_outside_temp_buf()) pos= strmov(pos, "LOCAL "); - pos= strmov(pos, "INFILE '"); - memcpy(pos, fname, fname_len); - pos= strmov(pos+fname_len, "' "); + pos= strmov(pos, "INFILE "); + pos= pretty_print_str(pos, fname, fname_len); + pos= strmov(pos, " "); if (sql_ex.opt_flags & REPLACE_FLAG) pos= strmov(pos, "REPLACE "); @@ -7339,9 +7339,9 @@ void Execute_load_query_log_event::print(FILE* file, if (local_fname) { my_b_write(&cache, (uchar*) query, fn_pos_start); - my_b_printf(&cache, " LOCAL INFILE \'"); - my_b_printf(&cache, "%s", local_fname); - my_b_printf(&cache, "\'"); + my_b_printf(&cache, " LOCAL INFILE "); + pretty_print_str(&cache, local_fname, strlen(local_fname)); + if (dup_handling == LOAD_DUP_REPLACE) my_b_printf(&cache, " REPLACE"); my_b_printf(&cache, " INTO"); |