diff --git a/lib/MySQL_Session.cpp b/lib/MySQL_Session.cpp index e628180dc..abb8170f3 100644 --- a/lib/MySQL_Session.cpp +++ b/lib/MySQL_Session.cpp @@ -529,6 +529,27 @@ bool MySQL_Session::handler_special_queries(PtrSize_t *pkt) { l_free(pkt->size,pkt->ptr); return true; } + if ( (pkt->size < 60) && (pkt->size > 38) && (strncasecmp((char *)"SET SESSION character_set_server",(char *)pkt->ptr+5,32)==0) ) { // issue #601 + char *idx=NULL; + char *p=(char *)pkt->ptr+37; + idx=(char *)memchr(p,'=',pkt->size-37); + //idx=memchr(pkt->ptr+37,'=',pkt->size-37); + if (idx) { // we found = + PtrSize_t pkt_2; + pkt_2.size=5+strlen((char *)"SET NAMES ")+pkt->size-1-(idx-(char *)pkt->ptr); + pkt_2.ptr=l_alloc(pkt_2.size); + mysql_hdr Hdr; + memcpy(&Hdr,pkt->ptr,sizeof(mysql_hdr)); + Hdr.pkt_length=pkt_2.size-5; + memcpy((char *)pkt_2.ptr+5,(char *)pkt->ptr+5,1); + memcpy(pkt_2.ptr,&Hdr,sizeof(mysql_hdr)); + strcpy((char *)pkt_2.ptr+5,(char *)"SET NAMES "); + memcpy((char *)pkt_2.ptr+15,idx+1,pkt->size-1-(idx-(char *)pkt->ptr)); + l_free(pkt->size,pkt->ptr); + pkt->size=pkt_2.size; + pkt->ptr=pkt_2.ptr; + } + } if ( (pkt->size < 35) && (pkt->size > 15) && (strncasecmp((char *)"SET NAMES ",(char *)pkt->ptr+5,10)==0) ) { char *unstripped=strndup((char *)pkt->ptr+15,pkt->size-15); char *name=trim_spaces_and_quotes_in_place(unstripped);