diff options
author | Nikita Popov <nikita.ppv@gmail.com> | 2019-10-07 17:40:59 +0200 |
---|---|---|
committer | Nikita Popov <nikita.ppv@gmail.com> | 2019-10-07 17:52:29 +0200 |
commit | 19e6abebc763e93e5c88f1f17ecaad7a07d2e478 (patch) | |
tree | 7b1d1c226fd8ad1191ed8fdd0380e3eb40a028d3 | |
parent | 7d19668f6021b8d4cc1179d9c835bec9e7e9ad0a (diff) | |
download | php-git-19e6abebc763e93e5c88f1f17ecaad7a07d2e478.tar.gz |
Check for object_init_ex() failure in user filter factory
-rw-r--r-- | ext/standard/tests/filters/object_init_failure.phpt | 19 | ||||
-rw-r--r-- | ext/standard/user_filters.c | 9 |
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); |