]> granicus.if.org Git - php/commitdiff
Merge branch 'PHP-7.4'
authorNikita Popov <nikita.ppv@gmail.com>
Wed, 20 May 2020 09:24:37 +0000 (11:24 +0200)
committerNikita Popov <nikita.ppv@gmail.com>
Wed, 20 May 2020 09:24:37 +0000 (11:24 +0200)
* PHP-7.4:
  Fix bug #79603, by retrying on RTD key collision

1  2 
Zend/zend_compile.c

index 58c74e1da08e95f93a6be5cca9ae6bd15ba82ddc,c498f953472433bd6cc96d8dce188c7a2b4a1e0a..9c6546ac41aac9990f4310fdb61ef17300b98f7c
@@@ -6662,8 -6405,15 +6663,15 @@@ void zend_compile_class_decl(znode *res
  
                zend_register_seen_symbol(lcname, ZEND_SYMBOL_CLASS);
        } else {
-               name = zend_generate_anon_class_name(decl);
-               lcname = zend_string_tolower(name);
+               /* Find an anon class name that is not in use yet. */
+               name = NULL;
+               lcname = NULL;
+               do {
+                       zend_tmp_string_release(name);
+                       zend_tmp_string_release(lcname);
 -                      name = zend_generate_anon_class_name(decl->start_lineno);
++                      name = zend_generate_anon_class_name(decl);
+                       lcname = zend_string_tolower(name);
+               } while (zend_hash_exists(CG(class_table), lcname));
        }
        lcname = zend_new_interned_string(lcname);
  
        if (decl->flags & ZEND_ACC_ANON_CLASS) {
                opline->opcode = ZEND_DECLARE_ANON_CLASS;
                opline->extended_value = zend_alloc_cache_slot();
 -              opline->result_type = IS_VAR;
 -              opline->result.var = get_temporary_variable();
 +              zend_make_var_result(result, opline);
                if (!zend_hash_add_ptr(CG(class_table), lcname, ce)) {
+                       /* We checked above that the class name is not used. This really shouldn't happen. */
                        zend_error_noreturn(E_ERROR,
                                "Runtime definition key collision for %s. This is a bug", ZSTR_VAL(name));
                }