summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristoph M. Becker <cmbecker69@gmx.de>2020-01-15 23:04:03 +0100
committerChristoph M. Becker <cmbecker69@gmx.de>2020-01-23 11:47:20 +0100
commit4130fe437a5db7ead1444d3748bd0fbad9829cb2 (patch)
tree02df4072419c04cab5695f0b9bf369041a286c2b
parent984d508825cc5ae8eaad2e74bafa573d6706f6ff (diff)
downloadphp-git-4130fe437a5db7ead1444d3748bd0fbad9829cb2.tar.gz
Make MSVCRT memory leak checking usable for the test suite
While basic support for MSVCRT debugging has been added long ago[1], the leak checking is not usable for the test suite, because we are no longer calling `xmlCleanupParser()` on RSHUTDOWN of ext/libxml[2], and therefore a few bogus leaks are reported whenever ext/libxml is unloaded. We therefore ignore memory leaks for this case. We introduce `ZEND_IGNORE_LEAKS_BEGIN()` and `ZEND_IGNORE_LEAKS_END()` to keep those ignores better readable, and also because these *might* be useful for other leak checkers as well. We also explicitly free the `zend_handlers_table` and the `p5s` to avoid spurious leak reports. [1] <http://git.php.net/?p=php-src.git;a=commit;h=d756e1db2324c1f4ab6f9b52e329959ce6a02bc3> [2] <http://git.php.net/?p=php-src.git;a=commit;h=8742276eb3905eb97a585417000c7b8df85006d4>
-rw-r--r--Zend/zend_portability.h8
-rw-r--r--Zend/zend_strtod.c16
-rw-r--r--Zend/zend_vm_execute.h8
-rw-r--r--Zend/zend_vm_execute.skl8
-rw-r--r--ext/libxml/config.w323
-rw-r--r--ext/libxml/libxml.c2
6 files changed, 41 insertions, 4 deletions
diff --git a/Zend/zend_portability.h b/Zend/zend_portability.h
index a2bb020451..58c42a289e 100644
--- a/Zend/zend_portability.h
+++ b/Zend/zend_portability.h
@@ -648,4 +648,12 @@ static zend_always_inline double _zend_get_nan(void) /* {{{ */
# 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 */
diff --git a/Zend/zend_strtod.c b/Zend/zend_strtod.c
index 08f8424e8c..2228e2262c 100644
--- a/Zend/zend_strtod.c
+++ b/Zend/zend_strtod.c
@@ -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
diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h
index 7fc4d1f691..da4efc5ffb 100644
--- a/Zend/zend_vm_execute.h
+++ b/Zend/zend_vm_execute.h
@@ -61333,13 +61333,17 @@ 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);
+ }
}
-static HashTable *zend_handlers_table = NULL;
-
static void init_opcode_serialiser(void)
{
int i;
diff --git a/Zend/zend_vm_execute.skl b/Zend/zend_vm_execute.skl
index 27aae16391..3e520e9bac 100644
--- a/Zend/zend_vm_execute.skl
+++ b/Zend/zend_vm_execute.skl
@@ -67,13 +67,17 @@ 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);
+ }
}
-static HashTable *zend_handlers_table = NULL;
-
static void init_opcode_serialiser(void)
{
int i;
diff --git a/ext/libxml/config.w32 b/ext/libxml/config.w32
index b11c57bc44..dd91c4b893 100644
--- a/ext/libxml/config.w32
+++ b/ext/libxml/config.w32
@@ -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"
diff --git a/ext/libxml/libxml.c b/ext/libxml/libxml.c
index 333dab4856..360d1999e7 100644
--- a/ext/libxml/libxml.c
+++ b/ext/libxml/libxml.c
@@ -752,7 +752,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);