]> granicus.if.org Git - php/commitdiff
Fixed bug #35872 (Prevent object store references during RSHUTDOWN)
authorandy wharmby <wharmby@php.net>
Mon, 5 Mar 2007 12:56:26 +0000 (12:56 +0000)
committerandy wharmby <wharmby@php.net>
Mon, 5 Mar 2007 12:56:26 +0000 (12:56 +0000)
NEWS
ext/com_dotnet/com_extension.c
ext/com_dotnet/com_wrapper.c
ext/com_dotnet/php_com_dotnet.h

diff --git a/NEWS b/NEWS
index b406b71ec7a1557cb7467407052d9ddb53ff363b..fdde257c7c24eb89b453788f027809d93958d440 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -58,5 +58,6 @@ PHP                                                                        NEWS
 - Added shm_has_var() function. (Mike)
 - Added str_getcsv() function. (Sara)
 - Added ext/hash support to ext/session's ID generator. (Sara)
+- Fixed bug #35872 (Prevent object store references during RSHUTDOWN) (Andy)  
 
 
index bc76f1bbd7efada0307c5f9951b24d0bbf9acf25..5150013105e38f24f6a7afb8ca9bad90c4fb95e9 100644 (file)
@@ -315,6 +315,7 @@ PHP_MSHUTDOWN_FUNCTION(com_dotnet)
  */
 PHP_RINIT_FUNCTION(com_dotnet)
 {
+       COMG(rshutdown_started) = 0;
        return SUCCESS;
 }
 /* }}} */
@@ -328,6 +329,7 @@ PHP_RSHUTDOWN_FUNCTION(com_dotnet)
                php_com_dotnet_rshutdown(TSRMLS_C);
        }
 #endif
+       COMG(rshutdown_started) = 1;
        return SUCCESS;
 }
 /* }}} */
index b698affa22027aa4bc91b74dea07d0c74fc54d9a..9690665e93ce7b60d5073dd4e1ad78b9afecb054 100644 (file)
@@ -92,13 +92,17 @@ static inline void trace(char *fmt, ...)
 # define TSRMLS_FIXED()
 #endif
 
-#define FETCH_DISP(methname)   \
-       TSRMLS_FIXED() \
-       php_dispatchex *disp = (php_dispatchex*)This; \
-       trace(" PHP:%s %s\n", Z_OBJCE_P(disp->object)->name, methname); \
-       if (GetCurrentThreadId() != disp->engine_thread) \
-               return RPC_E_WRONG_THREAD;
-
+#define FETCH_DISP(methname)                                                                                                                                                   \
+       TSRMLS_FIXED()                                                                                                                                                                          \
+       php_dispatchex *disp = (php_dispatchex*)This;                                                                                                           \
+       if (COMG(rshutdown_started)) {                                                                                                                                          \
+               trace(" PHP Object:%p (name:unknown) %s\n", disp->object,  methname);                                                   \
+       } else {                                                                                                                                                                                        \
+               trace(" PHP Object:%p (name:%s) %s\n", disp->object, Z_OBJCE_P(disp->object)->name, methname);  \
+       }                                                                                                                                                                                                       \
+       if (GetCurrentThreadId() != disp->engine_thread) {                                                                                                      \
+               return RPC_E_WRONG_THREAD;                                                                                                                                              \
+       }
 
 static HRESULT STDMETHODCALLTYPE disp_queryinterface( 
        IDispatchEx *This,
@@ -534,7 +538,7 @@ static php_dispatchex *disp_constructor(zval *object TSRMLS_DC)
 {
        php_dispatchex *disp = (php_dispatchex*)CoTaskMemAlloc(sizeof(php_dispatchex));
 
-       trace("constructing a COM proxy\n");
+       trace("constructing a COM wrapper for PHP object %p (%s)\n", object, Z_OBJCE_P(object)->name);
        
        if (disp == NULL)
                return NULL;
@@ -559,8 +563,13 @@ static void disp_destructor(php_dispatchex *disp)
 {
        TSRMLS_FETCH();
        
-       trace("destroying COM wrapper for PHP object %s\n", Z_OBJCE_P(disp->object)->name);
-
+       /* Object store not available during request shutdown */
+       if (COMG(rshutdown_started)) {
+               trace("destroying COM wrapper for PHP object %p (name:unknown)\n", disp->object);
+       } else {
+               trace("destroying COM wrapper for PHP object %p (name:%s)\n", disp->object, Z_OBJCE_P(disp->object)->name);
+       }
+                       
        disp->id = 0;
        
        if (disp->refcount > 0)
index 2358772999389660037ac6622a38408d1deb6a49..e64e357ee4fd513115c73c0e36264e32cdfb3a64 100644 (file)
@@ -47,6 +47,7 @@ ZEND_BEGIN_MODULE_GLOBALS(com_dotnet)
        zend_bool autoreg_case_sensitive;
        void *dotnet_runtime_stuff; /* opaque to avoid cluttering up other modules */
        int code_page; /* default code_page if left unspecified */
+       zend_bool rshutdown_started;
 ZEND_END_MODULE_GLOBALS(com_dotnet)
 
 #ifdef ZTS