Skip to content

Commit

Permalink
Fix handling of sccp exceptions
Browse files Browse the repository at this point in the history
We should clear the exception *before* we destroy the execute_data.
Add a variation of the test that indirects through another file,
and would crash otherwise.
  • Loading branch information
nikic committed Nov 27, 2020
1 parent a87d620 commit a505fc6
Show file tree
Hide file tree
Showing 3 changed files with 20 additions and 4 deletions.
9 changes: 5 additions & 4 deletions ext/opcache/Optimizer/sccp.c
Original file line number Diff line number Diff line change
Expand Up @@ -1046,16 +1046,17 @@ static inline int ct_eval_func_call(
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;

int retval = SUCCESS;
if (EG(exception)) {
zval_ptr_dtor(result);
zend_clear_exception();
return FAILURE;
retval = FAILURE;
}

return SUCCESS;
efree(execute_data);
EG(current_execute_data) = prev_execute_data;
return retval;
}

#define SET_RESULT(op, zv) do { \
Expand Down
2 changes: 2 additions & 0 deletions ext/opcache/tests/opt/sccp_exception2.inc
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
<?php
var_dump(version_compare('1.2', '2.1', '??'));
13 changes: 13 additions & 0 deletions ext/opcache/tests/opt/sccp_exception2.phpt
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
--TEST--
Exception thrown during SCCP evaluation, separate file variation
--FILE--
<?php
require __DIR__ . '/sccp_exception2.inc';
?>
--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 %s(%d): require('/home/nikic/php...')
#2 {main}
thrown in %s on line %d

0 comments on commit a505fc6

Please sign in to comment.