Handle exceptions during SCCP function evaluation

Easier to handle them than to ensure they can't happen in the
first place.
This commit is contained in:
Nikita Popov 2020-11-27 17:00:12 +01:00
parent 4f3cf983dc
commit e5aae35855
2 changed files with 21 additions and 0 deletions

View File

@ -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:
@ -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;
}

View File

@ -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