mirror of
https://github.com/MariaDB/server.git
synced 2026-05-06 15:15:34 +02:00
MDEV-13921 Audit log writes invalid SQL if single-line comments are
present.
Escape special characters (like \r \n \t) instead of
replacing them with spaces.
This commit is contained in:
parent
cfb3361748
commit
2e964b233b
3 changed files with 31 additions and 22 deletions
|
|
@ -1122,6 +1122,21 @@ do { \
|
|||
} while(0)
|
||||
|
||||
|
||||
#define ESC_MAP_SIZE 0x60
|
||||
static const char esc_map[ESC_MAP_SIZE]=
|
||||
{
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 'b', 't', 'n', 0, 'f', 'r', 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, '\'', 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, '\\', 0, 0, 0
|
||||
};
|
||||
|
||||
static char escaped_char(char c)
|
||||
{
|
||||
return ((unsigned char ) c) >= ESC_MAP_SIZE ? 0 : esc_map[(unsigned char) c];
|
||||
}
|
||||
|
||||
|
||||
static void setup_connection_initdb(struct connection_info *cn,
|
||||
|
|
@ -1328,21 +1343,16 @@ static size_t escape_string(const char *str, unsigned int len,
|
|||
const char *res_end= result + result_len - 2;
|
||||
while (len)
|
||||
{
|
||||
char esc_c;
|
||||
|
||||
if (result >= res_end)
|
||||
break;
|
||||
if (*str == '\'')
|
||||
if ((esc_c= escaped_char(*str)))
|
||||
{
|
||||
if (result+1 >= res_end)
|
||||
break;
|
||||
*(result++)= '\\';
|
||||
*(result++)= '\'';
|
||||
}
|
||||
else if (*str == '\\')
|
||||
{
|
||||
if (result+1 >= res_end)
|
||||
break;
|
||||
*(result++)= '\\';
|
||||
*(result++)= '\\';
|
||||
*(result++)= esc_c;
|
||||
}
|
||||
else if (is_space(*str))
|
||||
*(result++)= ' ';
|
||||
|
|
@ -1431,19 +1441,12 @@ static size_t escape_string_hide_passwords(const char *str, unsigned int len,
|
|||
no_password:
|
||||
if (result >= res_end)
|
||||
break;
|
||||
if (*str == '\'')
|
||||
if ((b_char= escaped_char(*str)))
|
||||
{
|
||||
if (result+1 >= res_end)
|
||||
break;
|
||||
*(result++)= '\\';
|
||||
*(result++)= '\'';
|
||||
}
|
||||
else if (*str == '\\')
|
||||
{
|
||||
if (result+1 >= res_end)
|
||||
break;
|
||||
*(result++)= '\\';
|
||||
*(result++)= '\\';
|
||||
*(result++)= b_char;
|
||||
}
|
||||
else if (is_space(*str))
|
||||
*(result++)= ' ';
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue