diff --git a/server/core/modutil.c b/server/core/modutil.c index a4209a09d..ae0c5531a 100644 --- a/server/core/modutil.c +++ b/server/core/modutil.c @@ -830,10 +830,16 @@ int modutil_count_statements(GWBUF* buffer) char* end = ((char*)(buffer)->end); int num = 1; - while((ptr = strnchr_esc(ptr,';', end - ptr))) + while(ptr < end && (ptr = strnchr_esc(ptr,';', end - ptr))) { num++; - ptr++; + while(*ptr == ';') + ptr++; + } + + if(*(end - 1) == ';') + { + num--; } return num; diff --git a/server/modules/filter/dbfwfilter.c b/server/modules/filter/dbfwfilter.c index 5a23f8965..0ad3e9150 100644 --- a/server/modules/filter/dbfwfilter.c +++ b/server/modules/filter/dbfwfilter.c @@ -1982,7 +1982,16 @@ routeQuery(FILTER *instance, void *session, GWBUF *queue) GWBUF* forward; ipaddr = strdup(dcb->remote); sprintf(uname_addr,"%s@%s",dcb->user,ipaddr); - + + if(modutil_is_SQL(queue) && modutil_count_statements(queue) > 1) + { + if(my_session->errmsg) + free(my_session->errmsg); + + my_session->errmsg = strdup("This filter does not support multi-statements."); + accept = false; + goto queryresolved; + } if((user = (USER*)hashtable_fetch(my_instance->htable, uname_addr)) == NULL){ while(user == NULL && next_ip_class(ipaddr)){