@@ -120,6 +120,7 @@ memchr2(const char *haystack, size_t haystack_len, char c0, char c1)
120120}
121121
122122/**
123+ * memmem might not exist on some systems
123124 */
124125static const char *
125126my_memmem (const char * haystack ,size_t hlen ,const char * needle ,size_t nlen )
@@ -285,9 +286,11 @@ static void st_clear(stoken_t * st)
285286static void st_assign_char (stoken_t * st ,const char stype ,size_t pos ,size_t len ,
286287const char value )
287288{
289+ /* done to elimiate unused warning */
290+ (void )len ;
288291st -> type = (char )stype ;
289292st -> pos = pos ;
290- st -> len = len ;
293+ st -> len = 1 ;
291294st -> val [0 ]= value ;
292295st -> val [1 ]= CHAR_NULL ;
293296}
@@ -299,7 +302,7 @@ static void st_assign(stoken_t * st, const char stype,
299302size_t last = len < MSIZE ?len : (MSIZE - 1 );
300303st -> type = (char )stype ;
301304st -> pos = pos ;
302- st -> len = len ;
305+ st -> len = last ;
303306memcpy (st -> val ,value ,last );
304307st -> val [last ]= CHAR_NULL ;
305308}
@@ -857,6 +860,25 @@ static size_t parse_xstring(struct libinjection_sqli_state *sf)
857860return pos + 2 + wlen + 1 ;
858861}
859862
863+ /**
864+ * This handles MS SQLSERVER bracket words
865+ * http://stackoverflow.com/questions/3551284/sql-serverwhat-do-brackets-mean-around-column-name
866+ *
867+ */
868+ static size_t parse_bword (struct libinjection_sqli_state * sf )
869+ {
870+ const char * cs = sf -> s ;
871+ size_t pos = sf -> pos ;
872+ const char * endptr = (const char * )memchr (cs + pos ,']' ,sf -> slen - pos );
873+ if (endptr == NULL ) {
874+ st_assign (sf -> current ,TYPE_BAREWORD ,pos ,sf -> slen - pos ,cs + pos );
875+ return sf -> slen ;
876+ }else {
877+ st_assign (sf -> current ,TYPE_BAREWORD ,pos , (endptr - cs )- pos + 1 ,cs + pos );
878+ return (endptr - cs )+ 1 ;
879+ }
880+ }
881+
860882static size_t parse_word (struct libinjection_sqli_state * sf )
861883{
862884char ch ;
@@ -865,7 +887,7 @@ static size_t parse_word(struct libinjection_sqli_state * sf)
865887const char * cs = sf -> s ;
866888size_t pos = sf -> pos ;
867889size_t wlen = strlencspn (cs + pos ,sf -> slen - pos ,
868- " {}<>:\\?=@!#~+-*/&|^%(),';\t\n\v\f\r\"\000" );
890+ "[] {}<>:\\?=@!#~+-*/&|^%(),';\t\n\v\f\r\"\000" );
869891
870892st_assign (sf -> current ,TYPE_BAREWORD ,pos ,wlen ,cs + pos );
871893
@@ -1720,8 +1742,7 @@ int libinjection_sqli_fold(struct libinjection_sqli_state * sf)
17201742 (sf -> tokenvec [left + 2 ].type == TYPE_NUMBER ||
17211743sf -> tokenvec [left + 2 ].type == TYPE_BAREWORD ||
17221744sf -> tokenvec [left + 2 ].type == TYPE_VARIABLE ||
1723- sf -> tokenvec [left + 2 ].type == TYPE_STRING ||
1724- sf -> tokenvec [left + 2 ].type == TYPE_FUNCTION )) {
1745+ sf -> tokenvec [left + 2 ].type == TYPE_STRING )) {
17251746/*
17261747 * interesting case turn ", -1" ->> ",1" PLUS we need to back up
17271748 * one token if possible to see if more folding can be done
@@ -1735,6 +1756,19 @@ int libinjection_sqli_fold(struct libinjection_sqli_state * sf)
17351756assert (pos >=3 );
17361757pos -= 3 ;
17371758continue ;
1759+ }else if (sf -> tokenvec [left ].type == TYPE_COMMA &&
1760+ st_is_unary_op (& sf -> tokenvec [left + 1 ])&&
1761+ sf -> tokenvec [left + 2 ].type == TYPE_FUNCTION ) {
1762+
1763+ /* Seperate case from above since you end up with
1764+ * 1,-sin(1) --> 1 (1)
1765+ * Here, just do
1766+ * 1,-sin(1) --> 1,sin(1)
1767+ * just remove unary opartor
1768+ */
1769+ st_copy (& sf -> tokenvec [left + 1 ],& sf -> tokenvec [left + 2 ]);
1770+ pos -= 1 ;
1771+ continue ;
17381772 }else if ((sf -> tokenvec [left ].type == TYPE_BAREWORD )&&
17391773 (sf -> tokenvec [left + 1 ].type == TYPE_DOT )&&
17401774 (sf -> tokenvec [left + 2 ].type == TYPE_BAREWORD )) {
@@ -2132,10 +2166,10 @@ static int reparse_as_mysql(struct libinjection_sqli_state * sql_state)
21322166/*
21332167 * This function is mostly use with SWIG
21342168 */
2135- struct libinjection_sqli_token * libinjection_sqli_get_token ( struct libinjection_sqli_state * sql_state ,
2136- int i )
2169+ struct libinjection_sqli_token *
2170+ libinjection_sqli_get_token ( struct libinjection_sqli_state * sql_state , int i )
21372171{
2138- if (i < 0 || i > ( int ) strlen ( sql_state -> fingerprint ) ) {
2172+ if (i < 0 || i > LIBINJECTION_SQLI_MAX_TOKENS ) {
21392173return NULL ;
21402174 }
21412175return & (sql_state -> tokenvec [i ]);