summaryrefslogtreecommitdiff
path: root/ext/session/mod_user.c
diff options
context:
space:
mode:
Diffstat (limited to 'ext/session/mod_user.c')
-rw-r--r--ext/session/mod_user.c122
1 files changed, 67 insertions, 55 deletions
diff --git a/ext/session/mod_user.c b/ext/session/mod_user.c
index 1b606b9a33..5d474deab5 100644
--- a/ext/session/mod_user.c
+++ b/ext/session/mod_user.c
@@ -1,8 +1,8 @@
/*
+----------------------------------------------------------------------+
- | PHP Version 5 |
+ | PHP Version 7 |
+----------------------------------------------------------------------+
- | Copyright (c) 1997-2013 The PHP Group |
+ | Copyright (c) 1997-2014 The PHP Group |
+----------------------------------------------------------------------+
| This source file is subject to version 3.01 of the PHP license, |
| that is bundled with this package in the file LICENSE, and is |
@@ -28,7 +28,6 @@ ps_module ps_mod_user = {
#define SESS_ZVAL_LONG(val, a) \
{ \
- MAKE_STD_ZVAL(a); \
ZVAL_LONG(a, val); \
}
@@ -40,58 +39,73 @@ ps_module ps_mod_user = {
#define SESS_ZVAL_STRINGN(vl, ln, a) \
{ \
- MAKE_STD_ZVAL(a); \
- ZVAL_STRINGL(a, vl, ln, 1); \
+ ZVAL_STRINGL(a, vl, ln); \
}
-static zval *ps_call_handler(zval *func, int argc, zval **argv TSRMLS_DC)
+#define SESS_ZVAL_STR(vl, a) \
+{ \
+ ZVAL_STR_COPY(a, vl); \
+}
+
+static void ps_call_handler(zval *func, int argc, zval *argv, zval *retval TSRMLS_DC)
{
int i;
- zval *retval = NULL;
-
- MAKE_STD_ZVAL(retval);
if (call_user_function(EG(function_table), NULL, func, retval, argc, argv TSRMLS_CC) == FAILURE) {
- zval_ptr_dtor(&retval);
- retval = NULL;
+ zval_ptr_dtor(retval);
+ ZVAL_UNDEF(retval);
+ } else if (Z_ISUNDEF_P(retval)) {
+ ZVAL_NULL(retval);
}
-
for (i = 0; i < argc; i++) {
zval_ptr_dtor(&argv[i]);
}
-
- return retval;
}
#define STDVARS \
- zval *retval = NULL; \
+ zval retval; \
int ret = FAILURE
#define PSF(a) PS(mod_user_names).name.ps_##a
-#define FINISH \
- if (retval) { \
- convert_to_long(retval); \
- ret = Z_LVAL_P(retval); \
- zval_ptr_dtor(&retval); \
- } \
+#define FINISH \
+ if (Z_TYPE(retval) != IS_UNDEF) { \
+ if (Z_TYPE(retval) == IS_TRUE) { \
+ ret = SUCCESS; \
+ } else if (Z_TYPE(retval) == IS_FALSE) { \
+ ret = FAILURE; \
+ } else if ((Z_TYPE(retval) == IS_LONG) && (Z_LVAL(retval) == -1)) { \
+ /* BC for clever users - Deprecate me */ \
+ ret = FAILURE; \
+ } else if ((Z_TYPE(retval) == IS_LONG) && (Z_LVAL(retval) == 0)) { \
+ /* BC for clever users - Deprecate me */ \
+ ret = SUCCESS; \
+ } else { \
+ if (!EG(exception)) { \
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, \
+ "Session callback expects true/false return value"); \
+ } \
+ ret = FAILURE; \
+ zval_ptr_dtor(&retval); \
+ } \
+ } \
return ret
PS_OPEN_FUNC(user)
{
- zval *args[2];
+ zval args[2];
STDVARS;
- if (PSF(open) == NULL) {
+ if (Z_ISUNDEF(PSF(open))) {
php_error_docref(NULL TSRMLS_CC, E_WARNING,
"user session functions not defined");
return FAILURE;
}
- SESS_ZVAL_STRING((char*)save_path, args[0]);
- SESS_ZVAL_STRING((char*)session_name, args[1]);
+ SESS_ZVAL_STRING((char*)save_path, &args[0]);
+ SESS_ZVAL_STRING((char*)session_name, &args[1]);
- retval = ps_call_handler(PSF(open), 2, args TSRMLS_CC);
+ ps_call_handler(&PSF(open), 2, args, &retval TSRMLS_CC);
PS(mod_user_implemented) = 1;
FINISH;
@@ -108,7 +122,7 @@ PS_CLOSE_FUNC(user)
}
zend_try {
- retval = ps_call_handler(PSF(close), 0, NULL TSRMLS_CC);
+ ps_call_handler(&PSF(close), 0, NULL, &retval TSRMLS_CC);
} zend_catch {
bailout = 1;
} zend_end_try();
@@ -116,7 +130,7 @@ PS_CLOSE_FUNC(user)
PS(mod_user_implemented) = 0;
if (bailout) {
- if (retval) {
+ if (!Z_ISUNDEF(retval)) {
zval_ptr_dtor(&retval);
}
zend_bailout();
@@ -127,17 +141,16 @@ PS_CLOSE_FUNC(user)
PS_READ_FUNC(user)
{
- zval *args[1];
+ zval args[1];
STDVARS;
- SESS_ZVAL_STRING((char*)key, args[0]);
+ SESS_ZVAL_STR(key, &args[0]);
- retval = ps_call_handler(PSF(read), 1, args TSRMLS_CC);
+ ps_call_handler(&PSF(read), 1, args, &retval TSRMLS_CC);
- if (retval) {
- if (Z_TYPE_P(retval) == IS_STRING) {
- *val = estrndup(Z_STRVAL_P(retval), Z_STRLEN_P(retval));
- *vallen = Z_STRLEN_P(retval);
+ if (!Z_ISUNDEF(retval)) {
+ if (Z_TYPE(retval) == IS_STRING) {
+ *val = zend_string_copy(Z_STR(retval));
ret = SUCCESS;
}
zval_ptr_dtor(&retval);
@@ -148,37 +161,37 @@ PS_READ_FUNC(user)
PS_WRITE_FUNC(user)
{
- zval *args[2];
+ zval args[2];
STDVARS;
- SESS_ZVAL_STRING((char*)key, args[0]);
- SESS_ZVAL_STRINGN((char*)val, vallen, args[1]);
+ SESS_ZVAL_STR(key, &args[0]);
+ SESS_ZVAL_STR(val, &args[1]);
- retval = ps_call_handler(PSF(write), 2, args TSRMLS_CC);
+ ps_call_handler(&PSF(write), 2, args, &retval TSRMLS_CC);
FINISH;
}
PS_DESTROY_FUNC(user)
{
- zval *args[1];
+ zval args[1];
STDVARS;
- SESS_ZVAL_STRING((char*)key, args[0]);
+ SESS_ZVAL_STR(key, &args[0]);
- retval = ps_call_handler(PSF(destroy), 1, args TSRMLS_CC);
+ ps_call_handler(&PSF(destroy), 1, args, &retval TSRMLS_CC);
FINISH;
}
PS_GC_FUNC(user)
{
- zval *args[1];
+ zval args[1];
STDVARS;
- SESS_ZVAL_LONG(maxlifetime, args[0]);
+ SESS_ZVAL_LONG(maxlifetime, &args[0]);
- retval = ps_call_handler(PSF(gc), 1, args TSRMLS_CC);
+ ps_call_handler(&PSF(gc), 1, args, &retval TSRMLS_CC);
FINISH;
}
@@ -186,19 +199,18 @@ PS_GC_FUNC(user)
PS_CREATE_SID_FUNC(user)
{
/* maintain backwards compatibility */
- if (PSF(create_sid) != NULL) {
- char *id = NULL;
- zval *retval = NULL;
+ if (!Z_ISUNDEF(PSF(create_sid))) {
+ zend_string *id = NULL;
+ zval retval;
- retval = ps_call_handler(PSF(create_sid), 0, NULL TSRMLS_CC);
+ ps_call_handler(&PSF(create_sid), 0, NULL, &retval TSRMLS_CC);
- if (retval) {
- if (Z_TYPE_P(retval) == IS_STRING) {
- id = estrndup(Z_STRVAL_P(retval), Z_STRLEN_P(retval));
+ if (!Z_ISUNDEF(retval)) {
+ if (Z_TYPE(retval) == IS_STRING) {
+ id = zend_string_copy(Z_STR(retval));
}
zval_ptr_dtor(&retval);
- }
- else {
+ } else {
php_error_docref(NULL TSRMLS_CC, E_ERROR, "No session id returned by function");
return NULL;
}
@@ -212,7 +224,7 @@ PS_CREATE_SID_FUNC(user)
}
/* function as defined by PS_MOD */
- return php_session_create_id(mod_data, newlen TSRMLS_CC);
+ return php_session_create_id(mod_data TSRMLS_CC);
}
/*