summaryrefslogtreecommitdiff
path: root/ext/session/session.c
diff options
context:
space:
mode:
authorYasuo Ohgaki <yohgaki@php.net>2016-09-01 10:12:23 +0900
committerYasuo Ohgaki <yohgaki@php.net>2016-09-01 10:12:23 +0900
commitb36ae7467e3c601e1921f1405c68a6793e956b49 (patch)
tree00fd51fc7596f9e5e46db42e9aea9029ce847b20 /ext/session/session.c
parent7505eaf6fa551901f704424cff18b67047d7176d (diff)
downloadphp-git-b36ae7467e3c601e1921f1405c68a6793e956b49.tar.gz
Revert "Revert "Merge RFC https://wiki.php.net/rfc/session-create-id""
This reverts commit 663f1c8fb08ba51a00d7d8ed6261916c6fc8d5df.
Diffstat (limited to 'ext/session/session.c')
-rw-r--r--ext/session/session.c23
1 files changed, 19 insertions, 4 deletions
diff --git a/ext/session/session.c b/ext/session/session.c
index 1bf3586187..633e6e4a32 100644
--- a/ext/session/session.c
+++ b/ext/session/session.c
@@ -2014,7 +2014,6 @@ static PHP_FUNCTION(session_regenerate_id)
/* {{{ proto void session_create_id([string prefix])
Generate new session ID. Intended for user save handlers. */
-#if 0
/* This is not used yet */
static PHP_FUNCTION(session_create_id)
{
@@ -2036,7 +2035,20 @@ static PHP_FUNCTION(session_create_id)
}
if (PS(session_status) == php_session_active) {
- new_id = PS(mod)->s_create_sid(&PS(mod_data));
+ int limit = 3;
+ while (limit--) {
+ new_id = PS(mod)->s_create_sid(&PS(mod_data));
+ if (!PS(mod)->s_validate_sid) {
+ break;
+ } else {
+ /* Detect collision and retry */
+ if (PS(mod)->s_validate_sid(&PS(mod_data), new_id) == FAILURE) {
+ zend_string_release(new_id);
+ continue;
+ }
+ break;
+ }
+ }
} else {
new_id = php_session_create_id(NULL);
}
@@ -2051,9 +2063,7 @@ static PHP_FUNCTION(session_create_id)
}
smart_str_0(&id);
RETVAL_NEW_STR(id.s);
- smart_str_free(&id);
}
-#endif
/* }}} */
/* {{{ proto string session_cache_limiter([string new_cache_limiter])
@@ -2324,6 +2334,10 @@ ZEND_BEGIN_ARG_INFO_EX(arginfo_session_id, 0, 0, 0)
ZEND_ARG_INFO(0, id)
ZEND_END_ARG_INFO()
+ZEND_BEGIN_ARG_INFO_EX(arginfo_session_create_id, 0, 0, 0)
+ ZEND_ARG_INFO(0, prefix)
+ZEND_END_ARG_INFO()
+
ZEND_BEGIN_ARG_INFO_EX(arginfo_session_regenerate_id, 0, 0, 0)
ZEND_ARG_INFO(0, delete_old_session)
ZEND_END_ARG_INFO()
@@ -2408,6 +2422,7 @@ static const zend_function_entry session_functions[] = {
PHP_FE(session_module_name, arginfo_session_module_name)
PHP_FE(session_save_path, arginfo_session_save_path)
PHP_FE(session_id, arginfo_session_id)
+ PHP_FE(session_create_id, arginfo_session_create_id)
PHP_FE(session_regenerate_id, arginfo_session_regenerate_id)
PHP_FE(session_decode, arginfo_session_decode)
PHP_FE(session_encode, arginfo_session_void)