From 8c4f7dd416a24124e141aded6340f868c75e2f5b Mon Sep 17 00:00:00 2001 From: "Christoph M. Becker" Date: Tue, 4 Aug 2020 18:25:50 +0200 Subject: [PATCH] Fix #48585: com_load_typelib holds reference, fails on second call Whether the type library is cached is actually irrelevant here; what matters is that the symbols are imported, and since these are not cached, we have to import them for every request. And we cannot cache the symbols, because the import depends on the current codepage, but the codepage is a `PHP_INI_ALL` setting. --- ext/com_dotnet/com_com.c | 6 ++---- ext/com_dotnet/com_extension.c | 4 +--- 2 files changed, 3 insertions(+), 7 deletions(-) diff --git a/ext/com_dotnet/com_com.c b/ext/com_dotnet/com_com.c index 2eeac4aaf2f2d..af72db63b188c 100644 --- a/ext/com_dotnet/com_com.c +++ b/ext/com_dotnet/com_com.c @@ -248,7 +248,7 @@ PHP_FUNCTION(com_create_instance) TL = php_com_load_typelib_via_cache(typelib_name, obj->code_page, &cached); if (TL) { - if (COMG(autoreg_on) && !cached) { + if (COMG(autoreg_on)) { php_com_import_typelib(TL, mode, obj->code_page); } @@ -838,9 +838,7 @@ PHP_FUNCTION(com_load_typelib) php_com_initialize(); pTL = php_com_load_typelib_via_cache(name, codepage, &cached); if (pTL) { - if (cached) { - RETVAL_TRUE; - } else if (php_com_import_typelib(pTL, cs ? CONST_CS : 0, codepage) == SUCCESS) { + if (php_com_import_typelib(pTL, cs ? CONST_CS : 0, codepage) == SUCCESS) { RETVAL_TRUE; } diff --git a/ext/com_dotnet/com_extension.c b/ext/com_dotnet/com_extension.c index 025f6803df15d..34e1f253e987e 100644 --- a/ext/com_dotnet/com_extension.c +++ b/ext/com_dotnet/com_extension.c @@ -252,9 +252,7 @@ static PHP_INI_MH(OnTypeLibFileUpdate) } if ((pTL = php_com_load_typelib_via_cache(typelib_name, COMG(code_page), &cached)) != NULL) { - if (!cached) { - php_com_import_typelib(pTL, mode, COMG(code_page)); - } + php_com_import_typelib(pTL, mode, COMG(code_page)); ITypeLib_Release(pTL); } }