summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAntony Dovgal <tony2001@php.net>2006-08-14 15:01:29 +0000
committerAntony Dovgal <tony2001@php.net>2006-08-14 15:01:29 +0000
commitf42e9f5e15507a121669a8d78cbe03a7e2b8ae7a (patch)
tree922e4916410e9a8860924735b0ed2f15a0b57dca
parent615a15d5fa22b467af045702e19cfa9870a2e160 (diff)
downloadphp-git-f42e9f5e15507a121669a8d78cbe03a7e2b8ae7a.tar.gz
MFH: fix #38450 (constructor is not called for classes used in userspace stream wrappers)
-rw-r--r--NEWS2
-rw-r--r--main/streams/userspace.c34
2 files changed, 36 insertions, 0 deletions
diff --git a/NEWS b/NEWS
index c001c55f0f..c58ffa8a1c 100644
--- a/NEWS
+++ b/NEWS
@@ -37,6 +37,8 @@ PHP NEWS
- Fixed phpinfo() cutoff of variables at \0. (Ilia)
- Fixed a bug in the filter extension that prevented magic_quotes_gpc from
being applied when RAW filter is used. (Ilia)
+- Fixed bug #38450 (constructor is not called for classes used in userspace
+ stream wrappers). (Tony)
- Fixed bug #38438 (DOMNodeList->item(0) segfault on empty NodeList). (Ilia)
- Fixed bug #38431 (xmlrpc_get_type() crashes PHP on objects). (Tony)
- Fixed bug #38424 (Different attribute assignment if new or existing). (Rob)
diff --git a/main/streams/userspace.c b/main/streams/userspace.c
index 5091dfdbe9..475b680593 100644
--- a/main/streams/userspace.c
+++ b/main/streams/userspace.c
@@ -231,6 +231,40 @@ static php_stream *user_wrapper_opener(php_stream_wrapper *wrapper, char *filena
object_init_ex(us->object, uwrap->ce);
ZVAL_REFCOUNT(us->object) = 1;
PZVAL_IS_REF(us->object) = 1;
+
+ if (uwrap->ce->constructor) {
+ zend_fcall_info fci;
+ zend_fcall_info_cache fcc;
+ zval *retval_ptr;
+
+ fci.size = sizeof(fci);
+ fci.function_table = &uwrap->ce->function_table;
+ fci.function_name = NULL;
+ fci.symbol_table = NULL;
+ fci.object_pp = &us->object;
+ fci.retval_ptr_ptr = &retval_ptr;
+ fci.param_count = 0;
+ fci.params = NULL;
+ fci.no_separation = 1;
+
+ fcc.initialized = 1;
+ fcc.function_handler = uwrap->ce->constructor;
+ fcc.calling_scope = EG(scope);
+ fcc.object_pp = &us->object;
+
+ if (zend_call_function(&fci, &fcc TSRMLS_CC) == FAILURE) {
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, "Could not execute %s::%s()", uwrap->ce->name, uwrap->ce->constructor->common.function_name);
+ zval_dtor(us->object);
+ FREE_ZVAL(us->object);
+ efree(us);
+ FG(user_stream_current_filename) = NULL;
+ return NULL;
+ } else {
+ if (retval_ptr) {
+ zval_ptr_dtor(&retval_ptr);
+ }
+ }
+ }
if (context) {
MAKE_STD_ZVAL(zcontext);