summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNikita Popov <nikita.ppv@gmail.com>2019-10-07 17:40:59 +0200
committerNikita Popov <nikita.ppv@gmail.com>2019-10-07 17:52:29 +0200
commit19e6abebc763e93e5c88f1f17ecaad7a07d2e478 (patch)
tree7b1d1c226fd8ad1191ed8fdd0380e3eb40a028d3
parent7d19668f6021b8d4cc1179d9c835bec9e7e9ad0a (diff)
downloadphp-git-19e6abebc763e93e5c88f1f17ecaad7a07d2e478.tar.gz
Check for object_init_ex() failure in user filter factory
-rw-r--r--ext/standard/tests/filters/object_init_failure.phpt19
-rw-r--r--ext/standard/user_filters.c9
2 files changed, 25 insertions, 3 deletions
diff --git a/ext/standard/tests/filters/object_init_failure.phpt b/ext/standard/tests/filters/object_init_failure.phpt
new file mode 100644
index 0000000000..8175bbe44b
--- /dev/null
+++ b/ext/standard/tests/filters/object_init_failure.phpt
@@ -0,0 +1,19 @@
+--TEST--
+Creating the stream filter object may fail
+--FILE--
+<?php
+class SampleFilter extends php_user_filter {
+ private $data = \FOO;
+}
+stream_filter_register('sample.filter', SampleFilter::class);
+try {
+ var_dump(file_get_contents('php://filter/read=sample.filter/resource='. __FILE__));
+} catch (Error $e) {
+ echo $e->getMessage(), "\n";
+}
+?>
+--EXPECTF--
+Warning: file_get_contents(): unable to create or locate filter "sample.filter" in %s on line %d
+
+Warning: file_get_contents(): Unable to create filter (sample.filter) in %s on line %d
+Undefined constant 'FOO'
diff --git a/ext/standard/user_filters.c b/ext/standard/user_filters.c
index 7749887f8f..3c0fe36957 100644
--- a/ext/standard/user_filters.c
+++ b/ext/standard/user_filters.c
@@ -323,14 +323,17 @@ static php_stream_filter *user_filter_factory_create(const char *filtername,
}
}
+ /* create the object */
+ if (object_init_ex(&obj, fdat->ce) == FAILURE) {
+ return NULL;
+ }
+
filter = php_stream_filter_alloc(&userfilter_ops, NULL, 0);
if (filter == NULL) {
+ zval_ptr_dtor(&obj);
return NULL;
}
- /* create the object */
- object_init_ex(&obj, fdat->ce);
-
/* filtername */
add_property_string(&obj, "filtername", (char*)filtername);