]> granicus.if.org Git - php/commitdiff
Merge RFC https://wiki.php.net/rfc/session-create-id
authorYasuo Ohgaki <yohgaki@php.net>
Wed, 31 Aug 2016 11:34:20 +0000 (20:34 +0900)
committerYasuo Ohgaki <yohgaki@php.net>
Wed, 31 Aug 2016 11:34:20 +0000 (20:34 +0900)
ext/session/session.c

index 1c0bde9d373408f8b4c07b0859a3ab8253636c0e..10208babaf52f21363889f6526f44f6648144cdf 100644 (file)
@@ -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)