diff --git a/include/c_tokenizer.h b/include/c_tokenizer.h index 31fb14df1..7e47633fc 100644 --- a/include/c_tokenizer.h +++ b/include/c_tokenizer.h @@ -5,6 +5,11 @@ #ifndef C_TOKENIZER_H #define C_TOKENIZER_H + +#ifndef FIRST_COMMENT_MAX_LENGTH +#define FIRST_COMMENT_MAX_LENGTH 1024 +#endif /* FIRST_COMMENT_MAX_LENGTH */ + typedef struct { char* s; @@ -23,8 +28,7 @@ extern "C" { tokenizer_t tokenizer( const char* s, const char* delimiters, int empties ); const char* free_tokenizer( tokenizer_t* tokenizer ); const char* tokenize( tokenizer_t* tokenizer ); -char * mysql_query_digest(char *s, int len); - +char * mysql_query_digest_and_first_comment(char *s , int len , char *first_comment); void c_split_2(const char *in, const char *del, char **out1, char **out2); #ifdef __cplusplus } diff --git a/lib/Query_Processor.cpp b/lib/Query_Processor.cpp index 6ac7a8f7e..9b965944e 100644 --- a/lib/Query_Processor.cpp +++ b/lib/Query_Processor.cpp @@ -69,6 +69,7 @@ struct __SQP_query_parser_t { sfilter sf; uint64_t digest; char *digest_text; + char *first_comment; uint64_t digest_total; }; @@ -794,9 +795,14 @@ void * Query_Processor::query_parser_init(char *query, int query_length, int fla if (mysql_thread___commands_stats) libinjection_sqli_init(&qp->sf, query, query_length, FLAG_SQL_MYSQL); qp->digest_text=NULL; + qp->first_comment=NULL; + qp->first_comment=(char *)l_alloc(FIRST_COMMENT_MAX_LENGTH); if (mysql_thread___query_digests) { - qp->digest_text=mysql_query_digest(query, query_length); + qp->digest_text=mysql_query_digest_and_first_comment(query, query_length, qp->first_comment); qp->digest=SpookyHash::Hash64(qp->digest_text,strlen(qp->digest_text),0); + if (strlen(qp->first_comment)) { + fprintf(stderr,"Comment= %s \n", qp->first_comment); + } } return (void *)qp; }; @@ -974,5 +980,8 @@ void Query_Processor::query_parser_free(void *args) { free(qp->digest_text); qp->digest_text=NULL; } - free(qp); + if (qp->first_comment) { + l_free(FIRST_COMMENT_MAX_LENGTH,qp->first_comment); + } + free(qp); }; diff --git a/lib/c_tokenizer.c b/lib/c_tokenizer.c index b0ca5a909..9707454e8 100644 --- a/lib/c_tokenizer.c +++ b/lib/c_tokenizer.c @@ -178,7 +178,7 @@ static char is_digit_string(char *f, char *t) } -char *mysql_query_digest(char *s, int len){ +char *mysql_query_digest_and_first_comment(char *s, int len, char *first_comment){ int i = 0; char *r = (char *) malloc(len + SIZECHAR); @@ -190,6 +190,8 @@ char *mysql_query_digest(char *s, int len){ char qutr_char = 0; char flag = 0; + char fc=0; + int fc_len=0; while(i < len) { @@ -250,6 +252,22 @@ char *mysql_query_digest(char *s, int len){ // -------- // comment // -------- + if (flag == 1) { + if (fc==0) { + fc=1; + } + if (fc==1) { + if (fc_len=2) fc_len-=2; + first_comment[fc_len]=0; + fc=2; + } + } + } if( // comment type 1 - /* .. */ (flag == 1 && prev_char == '*' && *s == '/') ||