Skip to content

Commit 08b616e

Browse files
committed
Backport relevant changes of #18719
These property writes may now throw exceptions because of property hooks, and this was not handled previously.
1 parent f47a7e8 commit 08b616e

File tree

3 files changed

+110
-0
lines changed

3 files changed

+110
-0
lines changed

Zend/tests/exception_027.phpt

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
--TEST--
2+
Exception properties are overridden by property hooks
3+
--FILE--
4+
<?php
5+
class MyException extends Exception
6+
{
7+
private bool $modified = false;
8+
9+
protected $code {
10+
set($value) {
11+
if ($this->modified) {
12+
throw new Exception();
13+
} else {
14+
$this->modified = true;
15+
16+
$this->code = $value;
17+
}
18+
}
19+
}
20+
}
21+
22+
$e = new MyException("foo", 1, new Exception());
23+
24+
try {
25+
$e->__construct("bar", 2, null);
26+
} catch (Exception) {
27+
}
28+
29+
var_dump($e->getMessage());
30+
var_dump($e->getCode());
31+
var_dump($e->getPrevious()::class);
32+
33+
?>
34+
--EXPECTF--
35+
string(3) "bar"
36+
int(1)
37+
string(9) "Exception"

Zend/tests/exception_028.phpt

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
--TEST--
2+
ErrorException properties are overridden by property hooks
3+
--FILE--
4+
<?php
5+
class MyException extends ErrorException
6+
{
7+
private bool $modified = false;
8+
9+
protected $code {
10+
set($value) {
11+
if ($this->modified) {
12+
throw new Exception();
13+
} else {
14+
$this->modified = true;
15+
16+
$this->code = $value;
17+
}
18+
}
19+
}
20+
}
21+
22+
$e = new MyException("foo", 1, E_NOTICE, "file1", 1, new Exception());
23+
24+
try {
25+
$e->__construct("bar", 2, E_WARNING, "file2", 2, null);
26+
} catch (Exception) {
27+
}
28+
29+
var_dump($e->getMessage());
30+
var_dump($e->getCode());
31+
var_dump($e->getSeverity());
32+
var_dump($e->getFile());
33+
var_dump($e->getLine());
34+
var_dump($e->getPrevious()::class);
35+
36+
?>
37+
--EXPECTF--
38+
string(3) "bar"
39+
int(1)
40+
int(8)
41+
string(5) "file1"
42+
int(1)
43+
string(9) "Exception"

Zend/zend_exceptions.c

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -320,15 +320,24 @@ ZEND_METHOD(Exception, __construct)
320320
if (message) {
321321
ZVAL_STR(&tmp, message);
322322
zend_update_property_ex(base_ce, Z_OBJ_P(object), ZSTR_KNOWN(ZEND_STR_MESSAGE), &tmp);
323+
if (UNEXPECTED(EG(exception))) {
324+
RETURN_THROWS();
325+
}
323326
}
324327

325328
if (code) {
326329
ZVAL_LONG(&tmp, code);
327330
zend_update_property_ex(base_ce, Z_OBJ_P(object), ZSTR_KNOWN(ZEND_STR_CODE), &tmp);
331+
if (UNEXPECTED(EG(exception))) {
332+
RETURN_THROWS();
333+
}
328334
}
329335

330336
if (previous) {
331337
zend_update_property_ex(base_ce, Z_OBJ_P(object), ZSTR_KNOWN(ZEND_STR_PREVIOUS), previous);
338+
if (UNEXPECTED(EG(exception))) {
339+
RETURN_THROWS();
340+
}
332341
}
333342
}
334343
/* }}} */
@@ -370,32 +379,53 @@ ZEND_METHOD(ErrorException, __construct)
370379
ZVAL_STR_COPY(&tmp, message);
371380
zend_update_property_ex(zend_ce_exception, Z_OBJ_P(object), ZSTR_KNOWN(ZEND_STR_MESSAGE), &tmp);
372381
zval_ptr_dtor(&tmp);
382+
if (UNEXPECTED(EG(exception))) {
383+
RETURN_THROWS();
384+
}
373385
}
374386

375387
if (code) {
376388
ZVAL_LONG(&tmp, code);
377389
zend_update_property_ex(zend_ce_exception, Z_OBJ_P(object), ZSTR_KNOWN(ZEND_STR_CODE), &tmp);
390+
if (UNEXPECTED(EG(exception))) {
391+
RETURN_THROWS();
392+
}
378393
}
379394

380395
if (previous) {
381396
zend_update_property_ex(zend_ce_exception, Z_OBJ_P(object), ZSTR_KNOWN(ZEND_STR_PREVIOUS), previous);
397+
if (UNEXPECTED(EG(exception))) {
398+
RETURN_THROWS();
399+
}
382400
}
383401

384402
ZVAL_LONG(&tmp, severity);
385403
zend_update_property_ex(zend_ce_exception, Z_OBJ_P(object), ZSTR_KNOWN(ZEND_STR_SEVERITY), &tmp);
404+
if (UNEXPECTED(EG(exception))) {
405+
RETURN_THROWS();
406+
}
386407

387408
if (filename) {
388409
ZVAL_STR_COPY(&tmp, filename);
389410
zend_update_property_ex(zend_ce_exception, Z_OBJ_P(object), ZSTR_KNOWN(ZEND_STR_FILE), &tmp);
390411
zval_ptr_dtor(&tmp);
412+
if (UNEXPECTED(EG(exception))) {
413+
RETURN_THROWS();
414+
}
391415
}
392416

393417
if (!lineno_is_null) {
394418
ZVAL_LONG(&tmp, lineno);
395419
zend_update_property_ex(zend_ce_exception, Z_OBJ_P(object), ZSTR_KNOWN(ZEND_STR_LINE), &tmp);
420+
if (UNEXPECTED(EG(exception))) {
421+
RETURN_THROWS();
422+
}
396423
} else if (filename) {
397424
ZVAL_LONG(&tmp, 0);
398425
zend_update_property_ex(zend_ce_exception, Z_OBJ_P(object), ZSTR_KNOWN(ZEND_STR_LINE), &tmp);
426+
if (UNEXPECTED(EG(exception))) {
427+
RETURN_THROWS();
428+
}
399429
}
400430
}
401431
/* }}} */

0 commit comments

Comments
 (0)