@@ -47,31 +47,37 @@ static void ps_call_handler(zval *func, int argc, zval *argv, zval *retval)
47
47
48
48
#define PSF (a ) PS(mod_user_names).ps_##a
49
49
50
- #define FINISH (return_value ) \
51
- if (Z_TYPE(return_value) != IS_UNDEF) { \
52
- if (Z_TYPE(return_value) == IS_TRUE) { \
53
- ret = SUCCESS; \
54
- } else if (Z_TYPE(return_value) == IS_FALSE) { \
55
- ret = FAILURE; \
56
- } else if ((Z_TYPE(return_value) == IS_LONG) && (Z_LVAL(return_value) == -1)) { \
57
- if (!EG(exception)) { \
58
- php_error_docref(NULL, E_DEPRECATED, "Session callback must have a return value of type bool, %s returned", zend_zval_type_name(&return_value)); \
59
- } \
60
- ret = FAILURE; \
61
- } else if ((Z_TYPE(return_value) == IS_LONG) && (Z_LVAL(return_value) == 0)) { \
62
- if (!EG(exception)) { \
63
- php_error_docref(NULL, E_DEPRECATED, "Session callback must have a return value of type bool, %s returned", zend_zval_type_name(&return_value)); \
64
- } \
65
- ret = SUCCESS; \
66
- } else { \
67
- if (!EG(exception)) { \
68
- zend_type_error("Session callback must have a return value of type bool, %s returned", zend_zval_type_name(&return_value)); \
69
- } \
70
- ret = FAILURE; \
71
- zval_ptr_dtor(&return_value); \
72
- } \
73
- } \
74
- return ret
50
+ static zend_result verify_bool_return_type_userland_calls (const zval * value )
51
+ {
52
+ /* Exit or exception in userland call */
53
+ if (Z_TYPE_P (value ) == IS_UNDEF ) {
54
+ return FAILURE ;
55
+ }
56
+ if (Z_TYPE_P (value ) == IS_TRUE ) {
57
+ return SUCCESS ;
58
+ }
59
+ if (Z_TYPE_P (value ) == IS_FALSE ) {
60
+ return FAILURE ;
61
+ }
62
+ if ((Z_TYPE_P (value ) == IS_LONG ) && (Z_LVAL_P (value ) == -1 )) {
63
+ /* TODO Why are exception cheked? */
64
+ if (!EG (exception )) {
65
+ php_error_docref (NULL , E_DEPRECATED , "Session callback must have a return value of type bool, %s returned" , zend_zval_type_name (value ));
66
+ }
67
+ return FAILURE ;
68
+ }
69
+ if ((Z_TYPE_P (value ) == IS_LONG ) && (Z_LVAL_P (value ) == 0 )) {
70
+ /* TODO Why are exception cheked? */
71
+ if (!EG (exception )) {
72
+ php_error_docref (NULL , E_DEPRECATED , "Session callback must have a return value of type bool, %s returned" , zend_zval_type_name (value ));
73
+ }
74
+ return SUCCESS ;
75
+ }
76
+ if (!EG (exception )) {
77
+ zend_type_error ("Session callback must have a return value of type bool, %s returned" , zend_zval_type_name (value )); \
78
+ }
79
+ return FAILURE ;
80
+ }
75
81
76
82
PS_OPEN_FUNC (user )
77
83
{
@@ -96,7 +102,9 @@ PS_OPEN_FUNC(user)
96
102
97
103
PS (mod_user_implemented ) = 1 ;
98
104
99
- FINISH (retval );
105
+ ret = verify_bool_return_type_userland_calls (& retval );
106
+ zval_ptr_dtor (& retval );
107
+ return ret ;
100
108
}
101
109
102
110
PS_CLOSE_FUNC (user )
@@ -127,7 +135,9 @@ PS_CLOSE_FUNC(user)
127
135
zend_bailout ();
128
136
}
129
137
130
- FINISH (retval );
138
+ ret = verify_bool_return_type_userland_calls (& retval );
139
+ zval_ptr_dtor (& retval );
140
+ return ret ;
131
141
}
132
142
133
143
PS_READ_FUNC (user )
@@ -166,7 +176,9 @@ PS_WRITE_FUNC(user)
166
176
167
177
ps_call_handler (& PSF (write ), 2 , args , & retval );
168
178
169
- FINISH (retval );
179
+ ret = verify_bool_return_type_userland_calls (& retval );
180
+ zval_ptr_dtor (& retval );
181
+ return ret ;
170
182
}
171
183
172
184
PS_DESTROY_FUNC (user )
@@ -181,7 +193,9 @@ PS_DESTROY_FUNC(user)
181
193
182
194
ps_call_handler (& PSF (destroy ), 1 , args , & retval );
183
195
184
- FINISH (retval );
196
+ ret = verify_bool_return_type_userland_calls (& retval );
197
+ zval_ptr_dtor (& retval );
198
+ return ret ;
185
199
}
186
200
187
201
PS_GC_FUNC (user )
@@ -250,7 +264,9 @@ PS_VALIDATE_SID_FUNC(user)
250
264
251
265
ps_call_handler (& PSF (validate_sid ), 1 , args , & retval );
252
266
253
- FINISH (retval );
267
+ ret = verify_bool_return_type_userland_calls (& retval );
268
+ zval_ptr_dtor (& retval );
269
+ return ret ;
254
270
}
255
271
256
272
/* dummy function defined by PS_MOD */
@@ -273,5 +289,7 @@ PS_UPDATE_TIMESTAMP_FUNC(user)
273
289
ps_call_handler (& PSF (write ), 2 , args , & retval );
274
290
}
275
291
276
- FINISH (retval );
292
+ ret = verify_bool_return_type_userland_calls (& retval );
293
+ zval_ptr_dtor (& retval );
294
+ return ret ;
277
295
}
0 commit comments