Skip to content

Commit

Permalink
fix issue for escape charcters in table parameters of Spider
Browse files Browse the repository at this point in the history
  • Loading branch information
Kentoku committed Jun 5, 2020
1 parent 793b84b commit 18f32f2
Showing 1 changed file with 92 additions and 38 deletions.
130 changes: 92 additions & 38 deletions storage/spider/spd_table.cc
Original file line number Diff line number Diff line change
Expand Up @@ -1071,7 +1071,7 @@ char *spider_get_string_between_quote(
SPIDER_PARAM_STRING_PARSE *param_string_parse
) {
char *start_ptr, *end_ptr, *tmp_ptr, *esc_ptr;
bool find_flg = FALSE, esc_flg = FALSE;
bool find_flg = FALSE;
DBUG_ENTER("spider_get_string_between_quote");

start_ptr = strchr(ptr, '\'');
Expand All @@ -1091,11 +1091,9 @@ char *spider_get_string_between_quote(
find_flg = TRUE;
else if (esc_ptr == end_ptr - 1)
{
esc_flg = TRUE;
tmp_ptr = end_ptr + 1;
break;
} else {
esc_flg = TRUE;
esc_ptr += 2;
}
}
Expand All @@ -1116,11 +1114,9 @@ char *spider_get_string_between_quote(
find_flg = TRUE;
else if (esc_ptr == end_ptr - 1)
{
esc_flg = TRUE;
tmp_ptr = end_ptr + 1;
break;
} else {
esc_flg = TRUE;
esc_ptr += 2;
}
}
Expand All @@ -1129,36 +1125,6 @@ char *spider_get_string_between_quote(
DBUG_RETURN(NULL);

*end_ptr = '\0';
if (esc_flg)
{
esc_ptr = start_ptr;
while (TRUE)
{
esc_ptr = strchr(esc_ptr, '\\');
if (!esc_ptr)
break;
switch(*(esc_ptr + 1))
{
case 'b':
*esc_ptr = '\b';
break;
case 'n':
*esc_ptr = '\n';
break;
case 'r':
*esc_ptr = '\r';
break;
case 't':
*esc_ptr = '\t';
break;
default:
*esc_ptr = *(esc_ptr + 1);
break;
}
esc_ptr++;
strcpy(esc_ptr, esc_ptr + 1);
}
}

if (param_string_parse)
param_string_parse->set_param_value(start_ptr, start_ptr + strlen(start_ptr) + 1);
Expand All @@ -1184,7 +1150,7 @@ int spider_create_string_list(
SPIDER_PARAM_STRING_PARSE *param_string_parse
) {
int roop_count;
char *tmp_ptr, *tmp_ptr2, *tmp_ptr3, *esc_ptr;
char *tmp_ptr, *tmp_ptr2, *tmp_ptr3, *tmp_ptr4, *esc_ptr;
bool find_flg = FALSE;
DBUG_ENTER("spider_create_string_list");

Expand All @@ -1206,22 +1172,30 @@ int spider_create_string_list(
DBUG_RETURN(0);
}

bool last_esc_flg = FALSE;
while (TRUE)
{
if ((tmp_ptr2 = strchr(tmp_ptr, ' ')))
{
find_flg = FALSE;
last_esc_flg = FALSE;
esc_ptr = tmp_ptr;
while (!find_flg)
{
esc_ptr = strchr(esc_ptr, '\\');
if (!esc_ptr || esc_ptr > tmp_ptr2)
{
find_flg = TRUE;
}
else if (esc_ptr == tmp_ptr2 - 1)
{
last_esc_flg = TRUE;
tmp_ptr = tmp_ptr2 + 1;
break;
} else
} else {
last_esc_flg = TRUE;
esc_ptr += 2;
}
}
if (find_flg)
{
Expand Down Expand Up @@ -1254,6 +1228,8 @@ int spider_create_string_list(

for (roop_count = 0; roop_count < (int) *list_length - 1; roop_count++)
{
bool esc_flg = FALSE;
find_flg = FALSE;
while (TRUE)
{
tmp_ptr2 = strchr(tmp_ptr, ' ');
Expand All @@ -1263,13 +1239,18 @@ int spider_create_string_list(
{
esc_ptr = strchr(esc_ptr, '\\');
if (!esc_ptr || esc_ptr > tmp_ptr2)
{
find_flg = TRUE;
}
else if (esc_ptr == tmp_ptr2 - 1)
{
esc_flg = TRUE;
tmp_ptr = tmp_ptr2 + 1;
break;
} else
} else {
esc_flg = TRUE;
esc_ptr += 2;
}
}
if (find_flg)
break;
Expand All @@ -1289,6 +1270,43 @@ int spider_create_string_list(
my_error(ER_OUT_OF_RESOURCES, MYF(0), HA_ERR_OUT_OF_MEM);
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
}

if (esc_flg)
{
esc_ptr = (*string_list)[roop_count];
while (TRUE)
{
esc_ptr = strchr(esc_ptr, '\\');
if (!esc_ptr)
break;
switch(*(esc_ptr + 1))
{
case 'b':
*esc_ptr = '\b';
break;
case 'n':
*esc_ptr = '\n';
break;
case 'r':
*esc_ptr = '\r';
break;
case 't':
*esc_ptr = '\t';
break;
default:
*esc_ptr = *(esc_ptr + 1);
break;
}
esc_ptr++;
tmp_ptr4 = esc_ptr;
do
{
*tmp_ptr4 = *(tmp_ptr4 + 1);
tmp_ptr4++;
} while (*tmp_ptr4);
(*string_length_list)[roop_count] -= 1;
}
}
DBUG_PRINT("info",("spider string_list[%d]=%s", roop_count,
(*string_list)[roop_count]));
tmp_ptr3 = tmp_ptr;
Expand All @@ -1300,6 +1318,42 @@ int spider_create_string_list(
my_error(ER_OUT_OF_RESOURCES, MYF(0), HA_ERR_OUT_OF_MEM);
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
}
if (last_esc_flg)
{
esc_ptr = (*string_list)[roop_count];
while (TRUE)
{
esc_ptr = strchr(esc_ptr, '\\');
if (!esc_ptr)
break;
switch(*(esc_ptr + 1))
{
case 'b':
*esc_ptr = '\b';
break;
case 'n':
*esc_ptr = '\n';
break;
case 'r':
*esc_ptr = '\r';
break;
case 't':
*esc_ptr = '\t';
break;
default:
*esc_ptr = *(esc_ptr + 1);
break;
}
esc_ptr++;
tmp_ptr4 = esc_ptr;
do
{
*tmp_ptr4 = *(tmp_ptr4 + 1);
tmp_ptr4++;
} while (*tmp_ptr4);
(*string_length_list)[roop_count] -= 1;
}
}

param_string_parse->set_param_value(tmp_ptr3,
tmp_ptr3 + strlen(tmp_ptr3) + 1);
Expand Down

0 comments on commit 18f32f2

Please sign in to comment.