iliaa Thu Feb 1 00:12:39 2007 UTC Modified files: (Branch: PHP_5_2) /php-src/ext/pdo/tests bug_39656.phpt /php-src NEWS /php-src/ext/pdo pdo_sql_parser.re pdo_sql_parser.c Log: Fixed bug #40285 (The PDO prepare parser goes into an infinite loop in some instances).
http://cvs.php.net/viewvc.cgi/php-src/ext/pdo/tests/bug_39656.phpt?r1=1.1.2.4&r2=1.1.2.5&diff_format=u Index: php-src/ext/pdo/tests/bug_39656.phpt diff -u php-src/ext/pdo/tests/bug_39656.phpt:1.1.2.4 php-src/ext/pdo/tests/bug_39656.phpt:1.1.2.5 --- php-src/ext/pdo/tests/bug_39656.phpt:1.1.2.4 Sat Dec 9 16:41:24 2006 +++ php-src/ext/pdo/tests/bug_39656.phpt Thu Feb 1 00:12:39 2007 @@ -1,5 +1,5 @@ --TEST-- -PDO Common: Bug #39656 (Crash when calling fetch() on a PDO statment object after closeCursor()) +PDO Common: Bug #40285 (The prepare parser goes into an infinite loop on ': or ":) --SKIPIF-- <?php if (!extension_loaded('pdo')) die('skip'); @@ -15,36 +15,13 @@ require_once getenv('REDIR_TEST_DIR') . 'pdo_test.inc'; $db = PDOTest::factory(); [EMAIL PROTECTED]>exec("DROP TABLE testtable"); -$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); +$db->exec('CREATE TABLE test (field1 VARCHAR(32), field2 VARCHAR(32), field3 VARCHAR(32), field4 INT)'); -$db->exec("CREATE TABLE testtable (id INTEGER NOT NULL PRIMARY KEY, usr VARCHAR( 256 ) NOT NULL)"); -$db->exec("INSERT INTO testtable (id, usr) VALUES (1, 'user')"); - -$stmt = $db->prepare("SELECT * FROM testtable WHERE id = ?"); -$stmt->bindValue(1, 1, PDO::PARAM_INT ); -$stmt->execute(); -$row = $stmt->fetch(); -var_dump( $row ); - -$stmt->execute(); -$stmt->closeCursor(); -$row = $stmt->fetch(); // this line will crash CLI -var_dump( $row ); +$db->setAttribute(PDO::ATTR_EMULATE_PREPARES, true); +$s = $db->prepare("INSERT INTO test VALUES( ':id', 'name', 'section', 22)" ); +$s->execute(); echo "Done\n"; ?> --EXPECT-- -array(4) { - ["id"]=> - string(1) "1" - [0]=> - string(1) "1" - ["usr"]=> - string(4) "user" - [1]=> - string(4) "user" -} -bool(false) Done - http://cvs.php.net/viewvc.cgi/php-src/NEWS?r1=1.2027.2.547.2.517&r2=1.2027.2.547.2.518&diff_format=u Index: php-src/NEWS diff -u php-src/NEWS:1.2027.2.547.2.517 php-src/NEWS:1.2027.2.547.2.518 --- php-src/NEWS:1.2027.2.547.2.517 Wed Jan 31 13:57:58 2007 +++ php-src/NEWS Thu Feb 1 00:12:39 2007 @@ -101,6 +101,8 @@ the user part of the email address. (Derick) - Fixed bug #40297 (compile failure in ZTS mode when collections support is missing). (Tony) +- Fixed bug #40285 (The PDO prepare parser goes into an infinite loop in + some instances). (Ilia) - Fixed bug #40259 (ob_start call many times - memory error). (Dmitry) - Fixed bug #40231 (file_exists incorrectly reports false). (Dmitry) - Fixed bug #40228 (ZipArchive::extractTo does create empty directories http://cvs.php.net/viewvc.cgi/php-src/ext/pdo/pdo_sql_parser.re?r1=1.28.2.4.2.6&r2=1.28.2.4.2.7&diff_format=u Index: php-src/ext/pdo/pdo_sql_parser.re diff -u php-src/ext/pdo/pdo_sql_parser.re:1.28.2.4.2.6 php-src/ext/pdo/pdo_sql_parser.re:1.28.2.4.2.7 --- php-src/ext/pdo/pdo_sql_parser.re:1.28.2.4.2.6 Wed Jan 3 22:05:24 2007 +++ php-src/ext/pdo/pdo_sql_parser.re Thu Feb 1 00:12:39 2007 @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: pdo_sql_parser.re,v 1.28.2.4.2.6 2007/01/03 22:05:24 nlopess Exp $ */ +/* $Id: pdo_sql_parser.re,v 1.28.2.4.2.7 2007/02/01 00:12:39 iliaa Exp $ */ #include "php.h" #include "php_pdo_driver.h" @@ -48,6 +48,7 @@ BINDCHR = [:][a-zA-Z0-9_]+; QUESTION = [?]; SPECIALS = [:?"']; + MULTICHAR = [:?]; EOF = [\000]; ANYNOEOF = [\001-\377]; */ @@ -55,7 +56,7 @@ /*!re2c (["] ([^"])* ["]) { RET(PDO_PARSER_TEXT); } (['] ([^'])* [']) { RET(PDO_PARSER_TEXT); } - SPECIALS{2,} { RET(PDO_PARSER_TEXT); } + MULTICHAR{2,} { RET(PDO_PARSER_TEXT); } BINDCHR { RET(PDO_PARSER_BIND); } QUESTION { RET(PDO_PARSER_BIND_POS); } SPECIALS { RET(PDO_PARSER_TEXT); } http://cvs.php.net/viewvc.cgi/php-src/ext/pdo/pdo_sql_parser.c?r1=1.35.2.6.2.8&r2=1.35.2.6.2.9&diff_format=u Index: php-src/ext/pdo/pdo_sql_parser.c diff -u php-src/ext/pdo/pdo_sql_parser.c:1.35.2.6.2.8 php-src/ext/pdo/pdo_sql_parser.c:1.35.2.6.2.9 --- php-src/ext/pdo/pdo_sql_parser.c:1.35.2.6.2.8 Wed Jan 3 22:05:24 2007 +++ php-src/ext/pdo/pdo_sql_parser.c Thu Feb 1 00:12:39 2007 @@ -1,4 +1,4 @@ -/* Generated by re2c 0.10.4 on Wed Jan 3 22:04:03 2007 */ +/* Generated by re2c 0.11.0 on Wed Jan 31 18:53:45 2007 */ #line 1 "ext/pdo/pdo_sql_parser.re" /* +----------------------------------------------------------------------+ @@ -18,7 +18,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: pdo_sql_parser.c,v 1.35.2.6.2.8 2007/01/03 22:05:24 nlopess Exp $ */ +/* $Id: pdo_sql_parser.c,v 1.35.2.6.2.9 2007/02/01 00:12:39 iliaa Exp $ */ #include "php.h" #include "php_pdo_driver.h" @@ -46,194 +46,253 @@ char *cursor = s->cur; s->tok = cursor; - #line 53 "ext/pdo/pdo_sql_parser.re" + #line 54 "ext/pdo/pdo_sql_parser.re" - { - static unsigned char yybm[] = { - 160, 162, 162, 162, 162, 162, 162, 162, - 162, 162, 162, 162, 162, 162, 162, 162, - 162, 162, 162, 162, 162, 162, 162, 162, - 162, 162, 162, 162, 162, 162, 162, 162, - 162, 162, 52, 162, 162, 162, 162, 196, - 162, 162, 162, 162, 162, 162, 162, 162, - 170, 170, 170, 170, 170, 170, 170, 170, - 170, 170, 244, 162, 162, 162, 162, 244, - 162, 170, 170, 170, 170, 170, 170, 170, - 170, 170, 170, 170, 170, 170, 170, 170, - 170, 170, 170, 170, 170, 170, 170, 170, - 170, 170, 170, 162, 162, 162, 162, 170, - 162, 170, 170, 170, 170, 170, 170, 170, - 170, 170, 170, 170, 170, 170, 170, 170, - 170, 170, 170, 170, 170, 170, 170, 170, - 170, 170, 170, 162, 162, 162, 162, 162, - 162, 162, 162, 162, 162, 162, 162, 162, - 162, 162, 162, 162, 162, 162, 162, 162, - 162, 162, 162, 162, 162, 162, 162, 162, - 162, 162, 162, 162, 162, 162, 162, 162, - 162, 162, 162, 162, 162, 162, 162, 162, - 162, 162, 162, 162, 162, 162, 162, 162, - 162, 162, 162, 162, 162, 162, 162, 162, - 162, 162, 162, 162, 162, 162, 162, 162, - 162, 162, 162, 162, 162, 162, 162, 162, - 162, 162, 162, 162, 162, 162, 162, 162, - 162, 162, 162, 162, 162, 162, 162, 162, - 162, 162, 162, 162, 162, 162, 162, 162, - 162, 162, 162, 162, 162, 162, 162, 162, - 162, 162, 162, 162, 162, 162, 162, 162, - 162, 162, 162, 162, 162, 162, 162, 162, - 162, 162, 162, 162, 162, 162, 162, 162, - }; - -#line 89 "ext/pdo/pdo_sql_parser.c" - { - YYCTYPE yych; - - if((YYLIMIT - YYCURSOR) < 3) YYFILL(3); - yych = *YYCURSOR; - if(yybm[0+yych] & 2) { - goto yy8; - } - if(yych <= 0x00) goto yy11; - if(yych <= '&') goto yy2; - if(yych <= '\'') goto yy4; - if(yych <= '>') goto yy5; - goto yy6; + +#line 54 "ext/pdo/pdo_sql_parser.c" +{ + YYCTYPE yych; + + if((YYLIMIT - YYCURSOR) < 2) YYFILL(2); + yych = *YYCURSOR; + switch(yych) { + case 0x00: goto yy11; + case '"': goto yy2; + case '\'': goto yy4; + case ':': goto yy5; + case '?': goto yy6; + default: goto yy8; + } yy2: - yych = *++YYCURSOR; - if(yybm[0+yych] & 64) { - goto yy28; - } - if(yych == '"') goto yy26; - goto yy30; + yych = *++YYCURSOR; + goto yy24; 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" + { RET(PDO_PARSER_TEXT); } +#line 74 "ext/pdo/pdo_sql_parser.c" yy4: - yych = *++YYCURSOR; - if(yybm[0+yych] & 16) { - goto yy19; - } - if(yych == '\'') goto yy21; - goto yy23; + yych = *++YYCURSOR; + goto yy20; yy5: - yych = *++YYCURSOR; - if(yybm[0+yych] & 4) { - goto yy13; - } - if(yych <= 'Z') { - if(yych <= '/') goto yy3; - if(yych <= ':') goto yy16; - if(yych <= '@') goto yy3; - goto yy16; - } else { - if(yych <= '_') { - if(yych <= '^') goto yy3; - goto yy16; - } else { - if(yych <= '`') goto yy3; - if(yych <= 'z') goto yy16; - goto yy3; - } - } + yych = *++YYCURSOR; + switch(yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'G': + case 'H': + case 'I': + case 'J': + case 'K': + case 'L': + case 'M': + case 'N': + case 'O': + case 'P': + case 'Q': + case 'R': + case 'S': + case 'T': + case 'U': + case 'V': + case 'W': + case 'X': + case 'Y': + case 'Z': + case '_': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': + case 'g': + case 'h': + case 'i': + case 'j': + case 'k': + case 'l': + case 'm': + case 'n': + case 'o': + case 'p': + case 'q': + case 'r': + case 's': + case 't': + case 'u': + case 'v': + case 'w': + case 'x': + case 'y': + case 'z': goto yy16; + case ':': + case '?': goto yy13; + default: goto yy3; + } yy6: - ++YYCURSOR; - if(yybm[0+(yych = *YYCURSOR)] & 4) { - goto yy13; - } -#line 60 "ext/pdo/pdo_sql_parser.re" - { RET(PDO_PARSER_BIND_POS); } -#line 148 "ext/pdo/pdo_sql_parser.c" -yy8: - ++YYCURSOR; - if(YYLIMIT == YYCURSOR) YYFILL(1); - yych = *YYCURSOR; - if(yybm[0+yych] & 2) { - goto yy8; - } -#line 62 "ext/pdo/pdo_sql_parser.re" - { RET(PDO_PARSER_TEXT); } + ++YYCURSOR; + switch((yych = *YYCURSOR)) { + case ':': + case '?': goto yy13; + default: goto yy7; + } +yy7: +#line 61 "ext/pdo/pdo_sql_parser.re" + { RET(PDO_PARSER_BIND_POS); } #line 158 "ext/pdo/pdo_sql_parser.c" -yy11: - ++YYCURSOR; +yy8: + ++YYCURSOR; + if(YYLIMIT == YYCURSOR) YYFILL(1); + yych = *YYCURSOR; + switch(yych) { + case 0x00: + case '"': + case '\'': + case ':': + case '?': goto yy10; + default: goto yy8; + } +yy10: #line 63 "ext/pdo/pdo_sql_parser.re" - { RET(PDO_PARSER_EOI); } -#line 163 "ext/pdo/pdo_sql_parser.c" + { RET(PDO_PARSER_TEXT); } +#line 174 "ext/pdo/pdo_sql_parser.c" +yy11: + ++YYCURSOR; +#line 64 "ext/pdo/pdo_sql_parser.re" + { RET(PDO_PARSER_EOI); } +#line 179 "ext/pdo/pdo_sql_parser.c" yy13: - ++YYCURSOR; - if(YYLIMIT == YYCURSOR) YYFILL(1); - yych = *YYCURSOR; - if(yybm[0+yych] & 4) { - goto yy13; - } -#line 58 "ext/pdo/pdo_sql_parser.re" - { RET(PDO_PARSER_TEXT); } -#line 173 "ext/pdo/pdo_sql_parser.c" -yy16: - ++YYCURSOR; - if(YYLIMIT == YYCURSOR) YYFILL(1); - yych = *YYCURSOR; - if(yybm[0+yych] & 8) { - goto yy16; - } + ++YYCURSOR; + if(YYLIMIT == YYCURSOR) YYFILL(1); + yych = *YYCURSOR; + switch(yych) { + case ':': + case '?': goto yy13; + default: goto yy15; + } +yy15: #line 59 "ext/pdo/pdo_sql_parser.re" - { RET(PDO_PARSER_BIND); } -#line 183 "ext/pdo/pdo_sql_parser.c" + { RET(PDO_PARSER_TEXT); } +#line 192 "ext/pdo/pdo_sql_parser.c" +yy16: + ++YYCURSOR; + if(YYLIMIT == YYCURSOR) YYFILL(1); + yych = *YYCURSOR; + switch(yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'G': + case 'H': + case 'I': + case 'J': + case 'K': + case 'L': + case 'M': + case 'N': + case 'O': + case 'P': + case 'Q': + case 'R': + case 'S': + case 'T': + case 'U': + case 'V': + case 'W': + case 'X': + case 'Y': + case 'Z': + case '_': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': + case 'g': + case 'h': + case 'i': + case 'j': + case 'k': + case 'l': + case 'm': + case 'n': + case 'o': + case 'p': + case 'q': + case 'r': + case 's': + case 't': + case 'u': + case 'v': + case 'w': + case 'x': + case 'y': + case 'z': goto yy16; + default: goto yy18; + } +yy18: +#line 60 "ext/pdo/pdo_sql_parser.re" + { RET(PDO_PARSER_BIND); } +#line 266 "ext/pdo/pdo_sql_parser.c" yy19: - if((YYLIMIT - YYCURSOR) < 2) YYFILL(2); - yych = *YYCURSOR; - if(yybm[0+yych] & 16) { - goto yy19; - } - if(yych != '\'') goto yy23; + ++YYCURSOR; + if(YYLIMIT == YYCURSOR) YYFILL(1); + yych = *YYCURSOR; +yy20: + switch(yych) { + case '\'': goto yy21; + default: goto yy19; + } yy21: - ++YYCURSOR; - if(yybm[0+(yych = *YYCURSOR)] & 4) { - goto yy13; - } -yy22: -#line 57 "ext/pdo/pdo_sql_parser.re" - { RET(PDO_PARSER_TEXT); } -#line 199 "ext/pdo/pdo_sql_parser.c" + ++YYCURSOR; +#line 58 "ext/pdo/pdo_sql_parser.re" + { RET(PDO_PARSER_TEXT); } +#line 280 "ext/pdo/pdo_sql_parser.c" yy23: - ++YYCURSOR; - if(YYLIMIT == YYCURSOR) YYFILL(1); - yych = *YYCURSOR; - if(yybm[0+yych] & 32) { - goto yy23; - } - yych = *++YYCURSOR; - goto yy22; -yy26: - ++YYCURSOR; - if(yybm[0+(yych = *YYCURSOR)] & 4) { - goto yy13; - } -yy27: -#line 56 "ext/pdo/pdo_sql_parser.re" - { RET(PDO_PARSER_TEXT); } -#line 217 "ext/pdo/pdo_sql_parser.c" -yy28: - if((YYLIMIT - YYCURSOR) < 2) YYFILL(2); - yych = *YYCURSOR; - if(yybm[0+yych] & 64) { - goto yy28; - } - if(yych == '"') goto yy26; -yy30: - ++YYCURSOR; - if(YYLIMIT == YYCURSOR) YYFILL(1); - yych = *YYCURSOR; - if(yybm[0+yych] & 128) { - goto yy30; - } - ++YYCURSOR; - yych = *YYCURSOR; - goto yy27; + ++YYCURSOR; + if(YYLIMIT == YYCURSOR) YYFILL(1); + yych = *YYCURSOR; +yy24: + switch(yych) { + case '"': goto yy25; + default: goto yy23; } +yy25: + ++YYCURSOR; +#line 57 "ext/pdo/pdo_sql_parser.re" + { RET(PDO_PARSER_TEXT); } +#line 294 "ext/pdo/pdo_sql_parser.c" } -#line 64 "ext/pdo/pdo_sql_parser.re" +#line 65 "ext/pdo/pdo_sql_parser.re" }
-- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php