Skip to content

Commit

Permalink
Handle exceptions during SCCP function evaluation
Browse files Browse the repository at this point in the history
Easier to handle them than to ensure they can't happen in the
first place.
  • Loading branch information
nikic committed Nov 27, 2020
1 parent 4f3cf98 commit e5aae35
Show file tree
Hide file tree
Showing 2 changed files with 21 additions and 0 deletions.
9 changes: 9 additions & 0 deletions ext/opcache/Optimizer/sccp.c
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@
#include "Optimizer/scdf.h"
#include "Optimizer/zend_dump.h"
#include "ext/standard/php_string.h"
#include "zend_exceptions.h"

/* This implements sparse conditional constant propagation (SCCP) based on the SCDF framework. The
* used value lattice is defined as follows:
Expand Down Expand Up @@ -1040,12 +1041,20 @@ static inline int ct_eval_func_call(
for (i = 0; i < num_args; i++) {
ZVAL_COPY(EX_VAR_NUM(i), args[i]);
}
ZVAL_NULL(result);
func->internal_function.handler(execute_data, result);
for (i = 0; i < num_args; i++) {
zval_ptr_dtor_nogc(EX_VAR_NUM(i));
}
efree(execute_data);
EG(current_execute_data) = prev_execute_data;

if (EG(exception)) {
zval_ptr_dtor(result);
zend_clear_exception();
return FAILURE;
}

return SUCCESS;
}

Expand Down
12 changes: 12 additions & 0 deletions ext/opcache/tests/opt/sccp_exception.phpt
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
--TEST--
Exception thrown during SCCP evaluation
--FILE--
<?php
var_dump(version_compare('1.2', '2.1', '??'));
?>
--EXPECTF--
Fatal error: Uncaught ValueError: version_compare(): Argument #3 ($operator) must be a valid comparison operator in %s:%d
Stack trace:
#0 %s(%d): version_compare('1.2', '2.1', '??')
#1 {main}
thrown in %s on line %d

0 comments on commit e5aae35

Please sign in to comment.