]> granicus.if.org Git - php/commitdiff
Revert "Revert "Merge RFC https://wiki.php.net/rfc/session-create-id""
authorYasuo Ohgaki <yohgaki@php.net>
Thu, 1 Sep 2016 01:12:23 +0000 (10:12 +0900)
committerYasuo Ohgaki <yohgaki@php.net>
Thu, 1 Sep 2016 01:12:23 +0000 (10:12 +0900)
This reverts commit 663f1c8fb08ba51a00d7d8ed6261916c6fc8d5df.

ext/session/session.c

index 1bf358618710930cb10ad90b9654b5f36206b7fb..633e6e4a3284a87c6456bc1fc24100576bfe3bb1 100644 (file)
@@ -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)