@@ -1804,7 +1804,9 @@ ZEND_VM_HANDLER(210, ZEND_FETCH_INNER_CLASS, CONST|TMPVAR|UNUSED, CONST, CACHE_S
18041804 SAVE_OPLINE ();
18051805
18061806 zend_string * inner_class_name , * full_class_name ;
1807- zend_class_entry * outer_ce = NULL , * inner_ce = NULL ;
1807+ zend_class_entry * outer_ce = NULL , * inner_ce = NULL , * scope = NULL ;
1808+
1809+ scope = EX (func )-> op_array .scope ;
18081810
18091811 if (OP1_TYPE == IS_CONST ) {
18101812 zval * outer_class_zv = RT_CONSTANT (opline , opline -> op1 );
@@ -1815,10 +1817,9 @@ ZEND_VM_HANDLER(210, ZEND_FETCH_INNER_CLASS, CONST|TMPVAR|UNUSED, CONST, CACHE_S
18151817 }
18161818 } else if (OP1_TYPE == IS_UNUSED ) {
18171819 uint32_t fetch_type ;
1818- zend_class_entry * called_scope , * scope ;
1820+ zend_class_entry * called_scope ;
18191821
1820- fetch_type = opline -> op1 .num ;
1821- scope = EX (func )-> op_array .scope ;
1822+ fetch_type = opline -> op1 .num & ZEND_FETCH_CLASS_MASK ;
18221823 if (UNEXPECTED (scope == NULL )) {
18231824 SAVE_OPLINE ();
18241825 zend_throw_error (NULL , "Cannot use \"%s\" in the global scope" ,
@@ -1827,9 +1828,9 @@ ZEND_VM_HANDLER(210, ZEND_FETCH_INNER_CLASS, CONST|TMPVAR|UNUSED, CONST, CACHE_S
18271828 ZVAL_UNDEF (EX_VAR (opline -> result .var ));
18281829 HANDLE_EXCEPTION ();
18291830 }
1830- if (fetch_type & ZEND_FETCH_CLASS_SELF ) {
1831+ if (fetch_type == ZEND_FETCH_CLASS_SELF ) {
18311832 outer_ce = scope ;
1832- } else if (fetch_type & ZEND_FETCH_CLASS_PARENT ) {
1833+ } else if (fetch_type == ZEND_FETCH_CLASS_PARENT ) {
18331834 if (UNEXPECTED (scope -> parent == NULL )) {
18341835 SAVE_OPLINE ();
18351836 zend_throw_error (NULL ,
@@ -1838,7 +1839,7 @@ ZEND_VM_HANDLER(210, ZEND_FETCH_INNER_CLASS, CONST|TMPVAR|UNUSED, CONST, CACHE_S
18381839 HANDLE_EXCEPTION ();
18391840 }
18401841 outer_ce = scope -> parent ;
1841- } else if (fetch_type & ZEND_FETCH_CLASS_STATIC ) {
1842+ } else if (fetch_type == ZEND_FETCH_CLASS_STATIC ) {
18421843 if (Z_TYPE (EX (This )) == IS_OBJECT ) {
18431844 called_scope = Z_OBJCE (EX (This ));
18441845 } else {
@@ -1867,6 +1868,17 @@ ZEND_VM_HANDLER(210, ZEND_FETCH_INNER_CLASS, CONST|TMPVAR|UNUSED, CONST, CACHE_S
18671868 inner_ce = zend_lookup_class (full_class_name );
18681869 if (!inner_ce ) {
18691870 zend_error (E_ERROR , "Class '%s' not found" , ZSTR_VAL (full_class_name ));
1871+ HANDLE_EXCEPTION ();
1872+ }
1873+
1874+ if (inner_ce -> required_scope ) {
1875+ if (inner_ce -> required_scope_absolute && inner_ce -> required_scope != scope ) {
1876+ zend_error (E_ERROR , "Class '%s' is private" , ZSTR_VAL (full_class_name ));
1877+ HANDLE_EXCEPTION ();
1878+ } else if (scope == NULL || !instanceof_function (scope , inner_ce -> required_scope )) {
1879+ zend_error (E_ERROR , "Class '%s' is protected" , ZSTR_VAL (full_class_name ));
1880+ HANDLE_EXCEPTION ();
1881+ }
18701882 }
18711883
18721884 CACHE_PTR (opline -> extended_value , inner_ce );
0 commit comments