@@ -2014,7 +2014,6 @@ static PHP_FUNCTION(session_regenerate_id)
2014
2014
2015
2015
/* {{{ proto void session_create_id([string prefix])
2016
2016
Generate new session ID. Intended for user save handlers. */
2017
- #if 0
2018
2017
/* This is not used yet */
2019
2018
static PHP_FUNCTION (session_create_id )
2020
2019
{
@@ -2036,7 +2035,20 @@ static PHP_FUNCTION(session_create_id)
2036
2035
}
2037
2036
2038
2037
if (PS (session_status ) == php_session_active ) {
2039
- new_id = PS (mod )-> s_create_sid (& PS (mod_data ));
2038
+ int limit = 3 ;
2039
+ while (limit -- ) {
2040
+ new_id = PS (mod )-> s_create_sid (& PS (mod_data ));
2041
+ if (!PS (mod )-> s_validate_sid ) {
2042
+ break ;
2043
+ } else {
2044
+ /* Detect collision and retry */
2045
+ if (PS (mod )-> s_validate_sid (& PS (mod_data ), new_id ) == FAILURE ) {
2046
+ zend_string_release (new_id );
2047
+ continue ;
2048
+ }
2049
+ break ;
2050
+ }
2051
+ }
2040
2052
} else {
2041
2053
new_id = php_session_create_id (NULL );
2042
2054
}
@@ -2051,9 +2063,7 @@ static PHP_FUNCTION(session_create_id)
2051
2063
}
2052
2064
smart_str_0 (& id );
2053
2065
RETVAL_NEW_STR (id .s );
2054
- smart_str_free (& id );
2055
2066
}
2056
- #endif
2057
2067
/* }}} */
2058
2068
2059
2069
/* {{{ proto string session_cache_limiter([string new_cache_limiter])
@@ -2324,6 +2334,10 @@ ZEND_BEGIN_ARG_INFO_EX(arginfo_session_id, 0, 0, 0)
2324
2334
ZEND_ARG_INFO (0 , id )
2325
2335
ZEND_END_ARG_INFO ()
2326
2336
2337
+ ZEND_BEGIN_ARG_INFO_EX (arginfo_session_create_id , 0 , 0 , 0 )
2338
+ ZEND_ARG_INFO (0 , prefix )
2339
+ ZEND_END_ARG_INFO ()
2340
+
2327
2341
ZEND_BEGIN_ARG_INFO_EX (arginfo_session_regenerate_id , 0 , 0 , 0 )
2328
2342
ZEND_ARG_INFO (0 , delete_old_session )
2329
2343
ZEND_END_ARG_INFO ()
@@ -2408,6 +2422,7 @@ static const zend_function_entry session_functions[] = {
2408
2422
PHP_FE (session_module_name , arginfo_session_module_name )
2409
2423
PHP_FE (session_save_path , arginfo_session_save_path )
2410
2424
PHP_FE (session_id , arginfo_session_id )
2425
+ PHP_FE (session_create_id , arginfo_session_create_id )
2411
2426
PHP_FE (session_regenerate_id , arginfo_session_regenerate_id )
2412
2427
PHP_FE (session_decode , arginfo_session_decode )
2413
2428
PHP_FE (session_encode , arginfo_session_void )
0 commit comments