@@ -39,8 +39,8 @@ static zend_class_entry *insert_namespace(const zend_string *name) {
3939 const char * pos = start ;
4040 size_t len = 0 ;
4141
42- while (pos < end ) {
43- if (* pos == '\\' ) {
42+ while (pos <= end ) {
43+ if (pos == end || * pos == '\\' ) {
4444 len = pos - start ;
4545 zend_string * needle = zend_string_init (ZSTR_VAL (name ), len , 0 );
4646
@@ -51,8 +51,14 @@ static zend_class_entry *insert_namespace(const zend_string *name) {
5151 ns = create_namespace (interned_name );
5252 ns -> lexical_scope = parent_ns ;
5353 zend_hash_add_ptr (EG (namespaces ), interned_name , ns );
54+
55+ /* sometimes, opcache refuses to intern the string */
56+ if (interned_name == needle ) {
57+ zend_string_release (interned_name );
58+ }
59+ } else {
60+ zend_string_release (needle );
5461 }
55- zend_string_release (needle );
5662
5763 parent_ns = ns ;
5864 }
@@ -96,9 +102,10 @@ zend_class_entry *zend_lookup_namespace(zend_string *name) {
96102}
97103
98104void zend_destroy_namespaces (void ) {
99- zend_hash_destroy (EG (namespaces ));
100- FREE_HASHTABLE (EG (namespaces ));
101- EG (namespaces ) = NULL ;
102- pefree (EG (global_namespace ), 0 );
103- EG (global_namespace ) = NULL ;
105+ if (EG (namespaces ) != NULL ) {
106+ zend_hash_destroy (EG (namespaces ));
107+ FREE_HASHTABLE (EG (namespaces ));
108+ EG (namespaces ) = NULL ;
109+ EG (global_namespace ) = NULL ;
110+ }
104111}
0 commit comments