xref: /PHP-8.3/ext/filter/callback_filter.c (revision af15923b)
1 /*
2   +----------------------------------------------------------------------+
3   | Copyright (c) The PHP Group                                          |
4   +----------------------------------------------------------------------+
5   | This source file is subject to version 3.01 of the PHP license,      |
6   | that is bundled with this package in the file LICENSE, and is        |
7   | available through the world-wide-web at the following url:           |
8   | https://www.php.net/license/3_01.txt                                 |
9   | If you did not receive a copy of the PHP license and are unable to   |
10   | obtain it through the world-wide-web, please send a note to          |
11   | license@php.net so we can mail you a copy immediately.               |
12   +----------------------------------------------------------------------+
13   | Authors: Derick Rethans <derick@php.net>                             |
14   +----------------------------------------------------------------------+
15 */
16 
17 #include "php_filter.h"
18 
php_filter_callback(PHP_INPUT_FILTER_PARAM_DECL)19 void php_filter_callback(PHP_INPUT_FILTER_PARAM_DECL)
20 {
21 	zval retval;
22 	zval args[1];
23 	int status;
24 
25 	if (!option_array || !zend_is_callable(option_array, IS_CALLABLE_SUPPRESS_DEPRECATIONS, NULL)) {
26 		zend_type_error("%s(): Option must be a valid callback", get_active_function_name());
27 		zval_ptr_dtor(value);
28 		ZVAL_NULL(value);
29 		return;
30 	}
31 
32 	ZVAL_COPY(&args[0], value);
33 	status = call_user_function(NULL, NULL, option_array, &retval, 1, args);
34 
35 	if (status == SUCCESS && !Z_ISUNDEF(retval)) {
36 		zval_ptr_dtor(value);
37 		ZVAL_COPY_VALUE(value, &retval);
38 	} else {
39 		zval_ptr_dtor(value);
40 		ZVAL_NULL(value);
41 	}
42 
43 	zval_ptr_dtor(&args[0]);
44 }
45