diff --git a/server/core/modutil.c b/server/core/modutil.c index cd596fb2b..b9a7aab1c 100644 --- a/server/core/modutil.c +++ b/server/core/modutil.c @@ -175,6 +175,51 @@ GWBUF *addition; return orig; } + +/** + * Extract the SQL from a COM_QUERY packet and return in a NULL terminated buffer. + * The buffer shoudl be freed by the caller when it is no longer required. + * + * If the packet is not a COM_QUERY packet then the function will return NULL + * + * @param buf The buffer chain + * @return Null terminated string containing query text or NULL on error + */ +char * +modutil_get_SQL(GWBUF *buf) +{ +unsigned int len, length; +unsigned char *ptr, *dptr, *rval = NULL; + + if (!modutil_is_SQL(buf)) + return rval; + ptr = GWBUF_DATA(buf); + length = *ptr++; + length += (*ptr++ << 8); + length += (*ptr++ << 16); + + if ((rval = (char *)malloc(length + 1)) == NULL) + return NULL; + dptr = rval; + ptr += 2; // Skip sequence id and COM_QUERY byte + len = GWBUF_LENGTH(buf) - 5; + while (buf && length > 0) + { + int clen = length > len ? len : length; + memcpy(dptr, ptr, clen); + dptr += clen; + length -= clen; + buf = buf->next; + if (buf) + { + ptr = GWBUF_DATA(buf); + len = GWBUF_LENGTH(buf); + } + } + *dptr = 0; + return rval; +} + /** * Copy query string from GWBUF buffer to separate memory area. * diff --git a/server/include/modutil.h b/server/include/modutil.h index eccdb9a9b..a0daf60a9 100644 --- a/server/include/modutil.h +++ b/server/include/modutil.h @@ -37,6 +37,7 @@ extern int modutil_is_SQL(GWBUF *); extern int modutil_extract_SQL(GWBUF *, char **, int *); extern int modutil_MySQL_Query(GWBUF *, char **, int *, int *); +extern char *modutil_get_SQL(GWBUF *); extern GWBUF *modutil_replace_SQL(GWBUF *, char *); extern char *modutil_get_query(GWBUF* buf); extern int modutil_send_mysql_err_packet(DCB *, int, int, int, const char *, const char *); diff --git a/server/modules/filter/qlafilter.c b/server/modules/filter/qlafilter.c index 43d07b613..0f669b060 100644 --- a/server/modules/filter/qlafilter.c +++ b/server/modules/filter/qlafilter.c @@ -202,7 +202,7 @@ int i; free(my_instance->filebase); my_instance->filebase = NULL; } - my_instance->source = strdup(params[i]->value); + my_instance->filebase = strdup(params[i]->value); } else if (!filter_standard_parameter(params[i]->name)) { @@ -408,7 +408,7 @@ struct timeval tv; { queue = gwbuf_make_contiguous(queue); } - if (modutil_extract_SQL(queue, &ptr, &length) != 0) + if ((ptr = modutil_get_SQL(queue)) != NULL) { if ((my_instance->match == NULL || regexec(&my_instance->re, ptr, 0, NULL, 0) == 0) && @@ -424,6 +424,7 @@ struct timeval tv; fwrite(ptr, sizeof(char), length, my_session->fp); fwrite("\n", sizeof(char), 1, my_session->fp); } + free(ptr); } } /* Pass the query downstream */ diff --git a/server/modules/filter/regexfilter.c b/server/modules/filter/regexfilter.c index 898aae101..b76442079 100644 --- a/server/modules/filter/regexfilter.c +++ b/server/modules/filter/regexfilter.c @@ -310,18 +310,21 @@ int length; { queue = gwbuf_make_contiguous(queue); } - modutil_extract_SQL(queue, &sql, &length); - newsql = regex_replace(sql, length, &my_instance->re, - my_instance->replace); - if (newsql) + if ((sql = modutil_get_SQL(queue)) != NULL) { - queue = modutil_replace_SQL(queue, newsql); - queue = gwbuf_make_contiguous(queue); - free(newsql); - my_session->replacements++; + newsql = regex_replace(sql, length, &my_instance->re, + my_instance->replace); + if (newsql) + { + queue = modutil_replace_SQL(queue, newsql); + queue = gwbuf_make_contiguous(queue); + free(newsql); + my_session->replacements++; + } + else + my_session->no_change++; + free(sql); } - else - my_session->no_change++; } return my_session->down.routeQuery(my_session->down.instance, diff --git a/server/modules/filter/tee.c b/server/modules/filter/tee.c index 60be14413..3b35d7b8e 100644 --- a/server/modules/filter/tee.c +++ b/server/modules/filter/tee.c @@ -403,14 +403,16 @@ GWBUF *clone = NULL; if (my_session->residual < 0) my_session->residual = 0; } - else if (my_session->active && - modutil_MySQL_Query(queue, &ptr, &length, &residual)) + else if (my_session->active && (ptr = modutil_get_SQL(queue) != NULL)) { if ((my_instance->match == NULL || regexec(&my_instance->re, ptr, 0, NULL, 0) == 0) && (my_instance->nomatch == NULL || regexec(&my_instance->nore,ptr,0,NULL, 0) != 0)) { + char *dummy; + + modutil_MySQL_Query(queue, &dummy, &length, &residual); clone = gwbuf_clone(queue); my_session->residual = residual; } diff --git a/server/modules/filter/topfilter.c b/server/modules/filter/topfilter.c index 1da4c5665..e4c16b2ba 100644 --- a/server/modules/filter/topfilter.c +++ b/server/modules/filter/topfilter.c @@ -453,7 +453,6 @@ routeQuery(FILTER *instance, void *session, GWBUF *queue) TOPN_INSTANCE *my_instance = (TOPN_INSTANCE *)instance; TOPN_SESSION *my_session = (TOPN_SESSION *)session; char *ptr; -int length; if (my_session->active) { @@ -461,7 +460,7 @@ int length; { queue = gwbuf_make_contiguous(queue); } - if (modutil_extract_SQL(queue, &ptr, &length) != 0) + if ((ptr = modutil_get_SQL(queue)) != NULL) { if ((my_instance->match == NULL || regexec(&my_instance->re, ptr, 0, NULL, 0) == 0) && @@ -472,7 +471,11 @@ int length; if (my_session->current) free(my_session->current); gettimeofday(&my_session->start, NULL); - my_session->current = strndup(ptr, length); + my_session->current = ptr; + } + else + { + free(ptr); } } }