summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYasuo Ohgaki <yohgaki@php.net>2016-08-31 20:34:20 +0900
committerYasuo Ohgaki <yohgaki@php.net>2016-08-31 20:34:20 +0900
commit7ee9f81c54ca888beae1c6aaeaccee1260012076 (patch)
tree4cf406a15fe9a54e5829e63f1d202b3ecc87d8b9
parentaeb7b4094a4a0cda965c2f83da289d8bcb41a544 (diff)
downloadphp-git-7ee9f81c54ca888beae1c6aaeaccee1260012076.tar.gz
Merge RFC https://wiki.php.net/rfc/session-create-id
-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 1c0bde9d37..10208babaf 100644
--- a/ext/session/session.c
+++ b/ext/session/session.c
@@ -2021,7 +2021,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)
{
@@ -2043,7 +2042,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);
}
@@ -2058,9 +2070,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])
@@ -2357,6 +2367,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()
@@ -2441,6 +2455,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)