mirror of
https://github.com/php/php-src.git
synced 2025-08-16 05:58:45 +02:00
Merge branch 'PHP-8.2' into PHP-8.3
* PHP-8.2: Fix GH-12953: SSA integrity verification failed when loading composer classmaps with more than 11k elements
This commit is contained in:
commit
fc82c27a3d
2 changed files with 33 additions and 7 deletions
4
NEWS
4
NEWS
|
@ -2,6 +2,10 @@ PHP NEWS
|
||||||
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||
?? ??? ????, PHP 8.3.2
|
?? ??? ????, PHP 8.3.2
|
||||||
|
|
||||||
|
- Core:
|
||||||
|
. Fixed bug GH-12953 (false positive SSA integrity verification failed when
|
||||||
|
loading composer classmaps with more than 11k elements). (nielsdos)
|
||||||
|
|
||||||
- Cli:
|
- Cli:
|
||||||
. Fix incorrect timeout in built-in web server when using router script and
|
. Fix incorrect timeout in built-in web server when using router script and
|
||||||
max_input_time. (ilutov)
|
max_input_time. (ilutov)
|
||||||
|
|
|
@ -122,7 +122,7 @@ void ssa_verify_integrity(zend_op_array *op_array, zend_ssa *ssa, const char *ex
|
||||||
/* Vars */
|
/* Vars */
|
||||||
for (i = 0; i < ssa->vars_count; i++) {
|
for (i = 0; i < ssa->vars_count; i++) {
|
||||||
zend_ssa_var *var = &ssa->vars[i];
|
zend_ssa_var *var = &ssa->vars[i];
|
||||||
int use, c;
|
int use;
|
||||||
uint32_t type = ssa->var_info[i].type;
|
uint32_t type = ssa->var_info[i].type;
|
||||||
|
|
||||||
if (var->definition < 0 && !var->definition_phi && i > op_array->last_var) {
|
if (var->definition < 0 && !var->definition_phi && i > op_array->last_var) {
|
||||||
|
@ -148,23 +148,45 @@ void ssa_verify_integrity(zend_op_array *op_array, zend_ssa *ssa, const char *ex
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
c = 0;
|
/* Floyd's cycle detection algorithm, applied for use chain. */
|
||||||
FOREACH_USE(var, use) {
|
use = var->use_chain;
|
||||||
if (++c > 10000) {
|
int second_use = use;
|
||||||
|
while (use >= 0 && second_use >= 0) {
|
||||||
|
use = zend_ssa_next_use(ssa->ops, var - ssa->vars, use);
|
||||||
|
second_use = zend_ssa_next_use(ssa->ops, var - ssa->vars, second_use);
|
||||||
|
if (second_use < 0) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
second_use = zend_ssa_next_use(ssa->ops, var - ssa->vars, second_use);
|
||||||
|
if (use == second_use) {
|
||||||
FAIL("cycle in uses of " VARFMT "\n", VAR(i));
|
FAIL("cycle in uses of " VARFMT "\n", VAR(i));
|
||||||
goto finish;
|
goto finish;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
FOREACH_USE(var, use) {
|
||||||
if (!is_used_by_op(ssa, use, i)) {
|
if (!is_used_by_op(ssa, use, i)) {
|
||||||
fprintf(stderr, "var " VARFMT " not in uses of op %d\n", VAR(i), use);
|
fprintf(stderr, "var " VARFMT " not in uses of op %d\n", VAR(i), use);
|
||||||
}
|
}
|
||||||
} FOREACH_USE_END();
|
} FOREACH_USE_END();
|
||||||
|
|
||||||
c = 0;
|
/* Floyd's cycle detection algorithm, applied for phi nodes. */
|
||||||
FOREACH_PHI_USE(var, phi) {
|
phi = var->phi_use_chain;
|
||||||
if (++c > 10000) {
|
zend_ssa_phi *second_phi = phi;
|
||||||
|
while (phi && second_phi) {
|
||||||
|
phi = zend_ssa_next_use_phi(ssa, var - ssa->vars, phi);
|
||||||
|
second_phi = zend_ssa_next_use_phi(ssa, var - ssa->vars, second_phi);
|
||||||
|
if (!second_phi) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
second_phi = zend_ssa_next_use_phi(ssa, var - ssa->vars, second_phi);
|
||||||
|
if (phi == second_phi) {
|
||||||
FAIL("cycle in phi uses of " VARFMT "\n", VAR(i));
|
FAIL("cycle in phi uses of " VARFMT "\n", VAR(i));
|
||||||
goto finish;
|
goto finish;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
FOREACH_PHI_USE(var, phi) {
|
||||||
if (!is_in_phi_sources(ssa, phi, i)) {
|
if (!is_in_phi_sources(ssa, phi, i)) {
|
||||||
FAIL("var " VARFMT " not in phi sources of %d\n", VAR(i), phi->ssa_var);
|
FAIL("var " VARFMT " not in phi sources of %d\n", VAR(i), phi->ssa_var);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue