]> granicus.if.org Git - php/commitdiff
Revert "Revert "Merge branch 'PHP-7.4'""
authorChristoph M. Becker <cmbecker69@gmx.de>
Wed, 20 May 2020 12:10:19 +0000 (14:10 +0200)
committerChristoph M. Becker <cmbecker69@gmx.de>
Wed, 20 May 2020 12:11:42 +0000 (14:11 +0200)
This reverts commit 28e650a, which reverted commit 046dcfb, which had
to be reverted due to phpdbg issues.  The culprit was that we did not
properly reset `zend_handler_table` to `NULL`, which is required for
SAPIs which may restart the engine after shutdown.

[1] <http://git.php.net/?p=php-src.git;a=commit;h=28e650abf8097a28789a005e5028fee095359583>
[2] <http://git.php.net/?p=php-src.git;a=commit;h=046dcfb531e242d36a7af2942b9b148290c3c7fe>

Zend/zend_portability.h
Zend/zend_strtod.c
Zend/zend_vm_execute.h
Zend/zend_vm_execute.skl
ext/libxml/config.w32
ext/libxml/libxml.c

index bfa41a4ffede80c6d3a76474d7cc6987faf5613c..f1d1ff12093087d871c8ab6a44c580f9bbaf3ec1 100644 (file)
@@ -613,4 +613,12 @@ extern "C++" {
 # define ZEND_PREFER_RELOAD
 #endif
 
+#if defined(ZEND_WIN32) && defined(_DEBUG) && defined(PHP_WIN32_DEBUG_HEAP)
+# define ZEND_IGNORE_LEAKS_BEGIN() _CrtSetDbgFlag(_CrtSetDbgFlag(_CRTDBG_REPORT_FLAG) & ~_CRTDBG_ALLOC_MEM_DF)
+# define ZEND_IGNORE_LEAKS_END() _CrtSetDbgFlag(_CrtSetDbgFlag(_CRTDBG_REPORT_FLAG) | _CRTDBG_ALLOC_MEM_DF)
+#else
+# define ZEND_IGNORE_LEAKS_BEGIN()
+# define ZEND_IGNORE_LEAKS_END()
+#endif
+
 #endif /* ZEND_PORTABILITY_H */
index 08f8424e8c5b4d81a8798e27dc129e7b1a0a8676..2228e2262cf1f0f37ea25b82504323a9abcd9f37 100644 (file)
@@ -546,6 +546,7 @@ Bigint {
  static Bigint *freelist[Kmax+1];
 
 static void destroy_freelist(void);
+static void free_p5s(void);
 
 #ifdef ZTS
 static MUTEX_T dtoa_mutex;
@@ -564,6 +565,8 @@ ZEND_API int zend_startup_strtod(void) /* {{{ */
 ZEND_API int zend_shutdown_strtod(void) /* {{{ */
 {
        destroy_freelist();
+       free_p5s();
+
 #ifdef ZTS
        tsrm_mutex_free(dtoa_mutex);
        dtoa_mutex = NULL;
@@ -4540,6 +4543,19 @@ static void destroy_freelist(void)
        FREE_DTOA_LOCK(0)
 }
 
+static void free_p5s(void)
+{
+       Bigint **listp, *tmp;
+
+       ACQUIRE_DTOA_LOCK(1)
+       listp = &p5s;
+       while ((tmp = *listp) != NULL) {
+               *listp = tmp->next;
+               free(tmp);
+       }
+       FREE_DTOA_LOCK(1)
+}
+
 #ifdef __cplusplus
 }
 #endif
index 1c10b8ccbfe46c89f4cde4443162d684621c8936..068e1338a377d6c5ff522543623e58aa7ae2c523 100644 (file)
@@ -59579,13 +59579,18 @@ void zend_vm_init(void)
        VM_TRACE_START();
 }
 
+static HashTable *zend_handlers_table = NULL;
+
 void zend_vm_dtor(void)
 {
        VM_TRACE_END();
+       if (zend_handlers_table) {
+               zend_hash_destroy(zend_handlers_table);
+               free(zend_handlers_table);
+               zend_handlers_table = NULL;
+       }
 }
 
-static HashTable *zend_handlers_table = NULL;
-
 static void init_opcode_serialiser(void)
 {
        int i;
index 27aae163913ab2554e7e07692e096ae7a5c8792d..170fc300bbb8bcec8f63b13081a6207840165c68 100644 (file)
@@ -67,13 +67,18 @@ void {%INITIALIZER_NAME%}(void)
        VM_TRACE_START();
 }
 
+static HashTable *zend_handlers_table = NULL;
+
 void zend_vm_dtor(void)
 {
        VM_TRACE_END();
+       if (zend_handlers_table) {
+               zend_hash_destroy(zend_handlers_table);
+               free(zend_handlers_table);
+               zend_handlers_table = NULL;
+       }
 }
 
-static HashTable *zend_handlers_table = NULL;
-
 static void init_opcode_serialiser(void)
 {
        int i;
index b11c57bc44a72d645dfa3256f0be30baa3d28aac..dd91c4b89352cf881b6dc4dd6980bc2ce006bfc7 100644 (file)
@@ -16,6 +16,9 @@ if (PHP_LIBXML == "yes") {
                        ADD_DEF_FILE("ext\\libxml\\php_libxml2.def");
                }
                PHP_INSTALL_HEADERS("ext/libxml/", "php_libxml.h");
+               if (PHP_CRT_DEBUG == "yes") {
+                       ADD_FLAG("CFLAGS_LIBXML", "/D PHP_WIN32_DEBUG_HEAP");
+               }
        } else {
                WARNING("libxml support can't be enabled, iconv or libxml are missing")
                PHP_LIBXML = "no"
index 18da8b67daca850eb3cc4a706793413b016882bd..85eaf7a0264ac3e4efaedea0c5891178acb3606c 100644 (file)
@@ -700,7 +700,9 @@ PHP_LIBXML_API void php_libxml_initialize(void)
 {
        if (!_php_libxml_initialized) {
                /* we should be the only one's to ever init!! */
+               ZEND_IGNORE_LEAKS_BEGIN();
                xmlInitParser();
+               ZEND_IGNORE_LEAKS_END();
 
                _php_libxml_default_entity_loader = xmlGetExternalEntityLoader();
                xmlSetExternalEntityLoader(_php_libxml_pre_ext_ent_loader);