Fixed Bug #70918 (Segfault using static outside of class scope)

This commit is contained in:
Xinchen Hui 2015-11-14 18:41:55 -08:00
parent 90027dd7f6
commit 06fe956460
3 changed files with 42 additions and 0 deletions

26
Zend/tests/bug70918.phpt Normal file
View file

@ -0,0 +1,26 @@
--TEST--
Bug #70918 (Segfault using static outside of class scope)
--FILE--
<?php
try {
static::x;
} catch (Error $e) {
var_dump($e->getMessage());
}
try {
parent::x;
} catch (Error $e) {
var_dump($e->getMessage());
}
try {
self::x;
} catch (Error $e) {
var_dump($e->getMessage());
}
?>
--EXPECT--
string(52) "Cannot access static:: when no class scope is active"
string(52) "Cannot access parent:: when no class scope is active"
string(50) "Cannot access self:: when no class scope is active"

View file

@ -5180,6 +5180,10 @@ ZEND_VM_HANDLER(181, ZEND_FETCH_CLASS_CONSTANT, VAR|CONST|UNUSED, CONST)
} else { } else {
if (OP1_TYPE == IS_UNUSED) { if (OP1_TYPE == IS_UNUSED) {
ce = zend_fetch_class(NULL, opline->op1.num); ce = zend_fetch_class(NULL, opline->op1.num);
if (UNEXPECTED(ce == NULL)) {
ZEND_ASSERT(EG(exception));
HANDLE_EXCEPTION();
}
} else { } else {
ce = Z_CE_P(EX_VAR(opline->op1.var)); ce = Z_CE_P(EX_VAR(opline->op1.var));
} }

View file

@ -5841,6 +5841,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_CLASS_CONSTANT_SPEC_CONS
} else { } else {
if (IS_CONST == IS_UNUSED) { if (IS_CONST == IS_UNUSED) {
ce = zend_fetch_class(NULL, opline->op1.num); ce = zend_fetch_class(NULL, opline->op1.num);
if (UNEXPECTED(ce == NULL)) {
ZEND_ASSERT(EG(exception));
HANDLE_EXCEPTION();
}
} else { } else {
ce = Z_CE_P(EX_VAR(opline->op1.var)); ce = Z_CE_P(EX_VAR(opline->op1.var));
} }
@ -17507,6 +17511,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_CLASS_CONSTANT_SPEC_VAR_
} else { } else {
if (IS_VAR == IS_UNUSED) { if (IS_VAR == IS_UNUSED) {
ce = zend_fetch_class(NULL, opline->op1.num); ce = zend_fetch_class(NULL, opline->op1.num);
if (UNEXPECTED(ce == NULL)) {
ZEND_ASSERT(EG(exception));
HANDLE_EXCEPTION();
}
} else { } else {
ce = Z_CE_P(EX_VAR(opline->op1.var)); ce = Z_CE_P(EX_VAR(opline->op1.var));
} }
@ -23906,6 +23914,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_CLASS_CONSTANT_SPEC_UNUS
} else { } else {
if (IS_UNUSED == IS_UNUSED) { if (IS_UNUSED == IS_UNUSED) {
ce = zend_fetch_class(NULL, opline->op1.num); ce = zend_fetch_class(NULL, opline->op1.num);
if (UNEXPECTED(ce == NULL)) {
ZEND_ASSERT(EG(exception));
HANDLE_EXCEPTION();
}
} else { } else {
ce = Z_CE_P(EX_VAR(opline->op1.var)); ce = Z_CE_P(EX_VAR(opline->op1.var));
} }