1 : /*
2 : +----------------------------------------------------------------------+
3 : | PHP Version 6 |
4 : +----------------------------------------------------------------------+
5 : | Copyright (c) 1997-2009 The PHP Group |
6 : +----------------------------------------------------------------------+
7 : | This source file is subject to version 3.01 of the PHP license, |
8 : | that is bundled with this package in the file LICENSE, and is |
9 : | available through the world-wide-web at the following url: |
10 : | http://www.php.net/license/3_01.txt |
11 : | If you did not receive a copy of the PHP license and are unable to |
12 : | obtain it through the world-wide-web, please send a note to |
13 : | license@php.net so we can mail you a copy immediately. |
14 : +----------------------------------------------------------------------+
15 : | Authors: Derick Rethans <derick@php.net> |
16 : +----------------------------------------------------------------------+
17 : */
18 :
19 : /* $Id: callback_filter.c 276986 2009-03-10 23:40:06Z helly $ */
20 :
21 : #include "php_filter.h"
22 :
23 : void php_filter_callback(PHP_INPUT_FILTER_PARAM_DECL)
24 33 : {
25 : zval *retval_ptr;
26 : zval ***args;
27 : int status;
28 :
29 33 : if (!option_array || !zend_is_callable(option_array, IS_CALLABLE_CHECK_NO_ACCESS, NULL TSRMLS_CC)) {
30 33 : php_error_docref(NULL TSRMLS_CC, E_WARNING, "First argument is expected to be a valid callback");
31 33 : zval_dtor(value);
32 33 : Z_TYPE_P(value) = IS_NULL;
33 33 : return;
34 : }
35 :
36 0 : args = safe_emalloc(sizeof(zval **), 1, 0);
37 0 : args[0] = &value;
38 :
39 0 : status = call_user_function_ex(EG(function_table), NULL, option_array, &retval_ptr, 1, args, 0, NULL TSRMLS_CC);
40 :
41 0 : if (status == SUCCESS && retval_ptr != NULL) {
42 0 : if (retval_ptr != value) {
43 0 : zval_dtor(value);
44 0 : COPY_PZVAL_TO_ZVAL(*value, retval_ptr);
45 : } else {
46 0 : zval_ptr_dtor(&retval_ptr);
47 : }
48 : } else {
49 0 : zval_dtor(value);
50 0 : Z_TYPE_P(value) = IS_NULL;
51 : }
52 :
53 0 : efree(args);
54 : }
55 :
56 : /*
57 : * Local variables:
58 : * tab-width: 4
59 : * c-basic-offset: 4
60 : * End:
61 : * vim600: noet sw=4 ts=4 fdm=marker
62 : * vim<600: noet sw=4 ts=4
63 : */
|