|
php.net | support | documentation | report a bug | advanced search | search howto | statistics | random bug | login |
PatchesPull RequestsHistoryAllCommentsChangesGit/SVN commits
[2007-01-30 10:53 UTC] derick@php.net
[2007-02-01 00:12 UTC] iliaa@php.net
|
|||||||||||||||||||||||||||
Copyright © 2001-2025 The PHP GroupAll rights reserved. |
Last updated: Fri Oct 24 07:00:01 2025 UTC |
Description: ------------ When running the reproduce code below the parser "pdo_parse_params" in ext/pdo/pdo_sql_parser.re goes into an infinite loop. This is NOT reproducible with re2c 0.9.12, but it is with 0.10.4 and 0.11.0. When I re-generate the parser with 0.11.0 and the -d (debug) flag, and I provide the YYDEBUG macro as follows (for example below the #define YYFILL(n) macro definition: #define YYDEBUG(s,c) { if (s != -1) { printf("state: %d ", s); printf("[%c]\n", c); } } the output is: state: 0 [I] state: 8 [I] state: 9 [N] state: 8 [N] state: 9 [S] state: 8 [S] state: 9 [E] state: 8 [E] state: 9 [R] state: 8 [R] state: 9 [T] state: 8 [T] state: 9 [ ] state: 8 [ ] state: 9 [I] state: 8 [I] state: 9 [N] state: 8 [N] state: 9 [T] state: 8 [T] state: 9 [O] state: 8 [O] state: 9 [ ] state: 8 [ ] state: 9 [q] state: 8 [q] state: 9 [u] state: 8 [u] state: 9 [e] state: 8 [e] state: 9 [r] state: 8 [r] state: 9 [y] state: 8 [y] state: 9 [_] state: 8 [_] state: 9 [t] state: 8 [t] state: 9 [e] state: 8 [e] state: 9 [s] state: 8 [s] state: 9 [t] state: 8 [t] state: 9 [ ] state: 8 [ ] state: 9 [V] state: 8 [V] state: 9 [A] state: 8 [A] state: 9 [L] state: 8 [L] state: 9 [U] state: 8 [U] state: 9 [E] state: 8 [E] state: 9 [S] state: 8 [S] state: 9 [(] state: 8 [(] state: 9 [ ] state: 8 [ ] state: 9 ['] state: 10 ['] 1 state: 0 ['] state: 4 ['] state: 19 [:] state: 20 [:] state: 19 [:] state: 20 [:] state: 19 [:] state: 20 [:] state: 19 [:] state: 20 [:] state: 19 [:] and from there on it loops. From what I can see it has to do with some ambiguous rules for single quoted strings and the SPECIALS token. Reproduce code: --------------- <?php $d = new PDO('mysql:dbname=ezc;host=localhost', 'root'); $d->setAttribute( PDO::ATTR_EMULATE_PREPARES, true ); $s = $d->prepare("INSERT INTO query_test VALUES( ':id', 'name', 'section', 22)" ); $s->execute(); (you don't actually need the table "query_test"). Expected result: ---------------- The values ":id", "name", "section" and 22 are added into the table. Actual result: -------------- An infinite loop in states 19 and 20 of the re2c parser.