iliaa Tue Jun 5 22:56:57 2007 UTC Modified files: /php-src/ext/pdo pdo_sql_parser.re pdo_sql_parser.c Log: MFB: Fixed bug #41596 (Fixed a crash inside pdo_pgsql on some non-well-formed SQL queries). http://cvs.php.net/viewvc.cgi/php-src/ext/pdo/pdo_sql_parser.re?r1=1.39&r2=1.40&diff_format=u Index: php-src/ext/pdo/pdo_sql_parser.re diff -u php-src/ext/pdo/pdo_sql_parser.re:1.39 php-src/ext/pdo/pdo_sql_parser.re:1.40 --- php-src/ext/pdo/pdo_sql_parser.re:1.39 Mon May 28 23:43:24 2007 +++ php-src/ext/pdo/pdo_sql_parser.re Tue Jun 5 22:56:57 2007 @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: pdo_sql_parser.re,v 1.39 2007/05/28 23:43:24 iliaa Exp $ */ +/* $Id: pdo_sql_parser.re,v 1.40 2007/06/05 22:56:57 iliaa Exp $ */ #include "php.h" #include "php_pdo_driver.h" @@ -28,6 +28,7 @@ #define PDO_PARSER_EOI 4 #define RET(i) {s->cur = cursor; return i; } +#define SKIP_ONE(i) {s->cur = s->tok + 1; return 1; } #define YYCTYPE unsigned char #define YYCURSOR cursor @@ -58,7 +59,7 @@ SPECIALS{2,} { RET(PDO_PARSER_TEXT); } BINDCHR { RET(PDO_PARSER_BIND); } QUESTION { RET(PDO_PARSER_BIND_POS); } - SPECIALS { RET(PDO_PARSER_TEXT); } + SPECIALS { SKIP_ONE(PDO_PARSER_TEXT); } (ANYNOEOF\SPECIALS)+ { RET(PDO_PARSER_TEXT); } EOF { RET(PDO_PARSER_EOI); } */ @@ -95,6 +96,10 @@ while((t = scan(&s)) != PDO_PARSER_EOI) { if (t == PDO_PARSER_BIND || t == PDO_PARSER_BIND_POS) { if (t == PDO_PARSER_BIND) { + int len = s.cur - s.tok; + if ((inquery < (s.cur - len)) && isalnum(*(s.cur - len - 1))) { + continue; + } query_type |= PDO_PLACEHOLDER_NAMED; } else { query_type |= PDO_PLACEHOLDER_POSITIONAL; http://cvs.php.net/viewvc.cgi/php-src/ext/pdo/pdo_sql_parser.c?r1=1.53&r2=1.54&diff_format=u Index: php-src/ext/pdo/pdo_sql_parser.c diff -u php-src/ext/pdo/pdo_sql_parser.c:1.53 php-src/ext/pdo/pdo_sql_parser.c:1.54 --- php-src/ext/pdo/pdo_sql_parser.c:1.53 Mon May 28 23:43:24 2007 +++ php-src/ext/pdo/pdo_sql_parser.c Tue Jun 5 22:56:57 2007 @@ -1,4 +1,4 @@ -/* Generated by re2c 0.10.4 on Wed Jan 3 22:02:19 2007 */ +/* Generated by re2c 0.11.0 on Tue Jun 5 18:56:17 2007 */ #line 1 "ext/pdo/pdo_sql_parser.re" /* +----------------------------------------------------------------------+ @@ -18,7 +18,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: pdo_sql_parser.c,v 1.53 2007/05/28 23:43:24 iliaa Exp $ */ +/* $Id: pdo_sql_parser.c,v 1.54 2007/06/05 22:56:57 iliaa Exp $ */ #include "php.h" #include "php_pdo_driver.h" @@ -30,6 +30,7 @@ #define PDO_PARSER_EOI 4 #define RET(i) {s->cur = cursor; return i; } +#define SKIP_ONE(i) {s->cur = s->tok + 1; return 1; } #define YYCTYPE unsigned char #define YYCURSOR cursor @@ -46,7 +47,7 @@ char *cursor = s->cur; s->tok = cursor; - #line 53 "ext/pdo/pdo_sql_parser.re" + #line 54 "ext/pdo/pdo_sql_parser.re" { @@ -85,7 +86,7 @@ 162, 162, 162, 162, 162, 162, 162, 162, }; -#line 89 "ext/pdo/pdo_sql_parser.c" +#line 90 "ext/pdo/pdo_sql_parser.c" { YYCTYPE yych; @@ -107,9 +108,9 @@ if(yych == '"') goto yy26; goto yy30; yy3: -#line 61 "ext/pdo/pdo_sql_parser.re" - { RET(PDO_PARSER_TEXT); } -#line 113 "ext/pdo/pdo_sql_parser.c" +#line 62 "ext/pdo/pdo_sql_parser.re" + { SKIP_ONE(PDO_PARSER_TEXT); } +#line 114 "ext/pdo/pdo_sql_parser.c" yy4: yych = *++YYCURSOR; if(yybm[0+yych] & 16) { @@ -142,9 +143,9 @@ if(yybm[0+(yych = *YYCURSOR)] & 4) { goto yy13; } -#line 60 "ext/pdo/pdo_sql_parser.re" +#line 61 "ext/pdo/pdo_sql_parser.re" { RET(PDO_PARSER_BIND_POS); } -#line 148 "ext/pdo/pdo_sql_parser.c" +#line 149 "ext/pdo/pdo_sql_parser.c" yy8: ++YYCURSOR; if(YYLIMIT == YYCURSOR) YYFILL(1); @@ -152,14 +153,14 @@ if(yybm[0+yych] & 2) { goto yy8; } -#line 62 "ext/pdo/pdo_sql_parser.re" +#line 63 "ext/pdo/pdo_sql_parser.re" { RET(PDO_PARSER_TEXT); } -#line 158 "ext/pdo/pdo_sql_parser.c" +#line 159 "ext/pdo/pdo_sql_parser.c" yy11: ++YYCURSOR; -#line 63 "ext/pdo/pdo_sql_parser.re" +#line 64 "ext/pdo/pdo_sql_parser.re" { RET(PDO_PARSER_EOI); } -#line 163 "ext/pdo/pdo_sql_parser.c" +#line 164 "ext/pdo/pdo_sql_parser.c" yy13: ++YYCURSOR; if(YYLIMIT == YYCURSOR) YYFILL(1); @@ -167,9 +168,9 @@ if(yybm[0+yych] & 4) { goto yy13; } -#line 58 "ext/pdo/pdo_sql_parser.re" +#line 59 "ext/pdo/pdo_sql_parser.re" { RET(PDO_PARSER_TEXT); } -#line 173 "ext/pdo/pdo_sql_parser.c" +#line 174 "ext/pdo/pdo_sql_parser.c" yy16: ++YYCURSOR; if(YYLIMIT == YYCURSOR) YYFILL(1); @@ -177,9 +178,9 @@ if(yybm[0+yych] & 8) { goto yy16; } -#line 59 "ext/pdo/pdo_sql_parser.re" +#line 60 "ext/pdo/pdo_sql_parser.re" { RET(PDO_PARSER_BIND); } -#line 183 "ext/pdo/pdo_sql_parser.c" +#line 184 "ext/pdo/pdo_sql_parser.c" yy19: if((YYLIMIT - YYCURSOR) < 2) YYFILL(2); yych = *YYCURSOR; @@ -193,9 +194,9 @@ goto yy13; } yy22: -#line 57 "ext/pdo/pdo_sql_parser.re" +#line 58 "ext/pdo/pdo_sql_parser.re" { RET(PDO_PARSER_TEXT); } -#line 199 "ext/pdo/pdo_sql_parser.c" +#line 200 "ext/pdo/pdo_sql_parser.c" yy23: ++YYCURSOR; if(YYLIMIT == YYCURSOR) YYFILL(1); @@ -211,9 +212,9 @@ goto yy13; } yy27: -#line 56 "ext/pdo/pdo_sql_parser.re" +#line 57 "ext/pdo/pdo_sql_parser.re" { RET(PDO_PARSER_TEXT); } -#line 217 "ext/pdo/pdo_sql_parser.c" +#line 218 "ext/pdo/pdo_sql_parser.c" yy28: if((YYLIMIT - YYCURSOR) < 2) YYFILL(2); yych = *YYCURSOR; @@ -233,7 +234,7 @@ goto yy27; } } -#line 64 "ext/pdo/pdo_sql_parser.re" +#line 65 "ext/pdo/pdo_sql_parser.re" } @@ -268,6 +269,10 @@ while((t = scan(&s)) != PDO_PARSER_EOI) { if (t == PDO_PARSER_BIND || t == PDO_PARSER_BIND_POS) { if (t == PDO_PARSER_BIND) { + int len = s.cur - s.tok; + if ((inquery < (s.cur - len)) && isalnum(*(s.cur - len - 1))) { + continue; + } query_type |= PDO_PLACEHOLDER_NAMED; } else { query_type |= PDO_PLACEHOLDER_POSITIONAL;
-- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php