]> granicus.if.org Git - php/commitdiff
Merge branch 'PHP-5.6' into PHP-7.0
authorYasuo Ohgaki <yohgaki@php.net>
Wed, 16 Dec 2015 00:34:41 +0000 (09:34 +0900)
committerYasuo Ohgaki <yohgaki@php.net>
Wed, 16 Dec 2015 00:34:41 +0000 (09:34 +0900)
* PHP-5.6:
  Fixed bug #71122 Session GC may not remove obsolete session data

1  2 
ext/session/session.c
ext/session/tests/session_set_save_handler_variation4.phpt

index 2f2f9f7e461a1ab170a3b6ed4b4039b2cfa3790f,aec2ed06c22dc36f2746a5d08bfaeb34b2456232..61ccc343171ca673f8b61361fccfcf90ca9fa110
@@@ -477,12 -468,35 +477,34 @@@ PHPAPI int php_session_valid_key(const 
  }
  /* }}} */
  
 -              nrand = (int) ((float) PS(gc_divisor) * php_combined_lcg(TSRMLS_C));
+ static void php_session_gc(void) /* {{{ */
+ {
+       int nrand;
+       /* GC must be done before reading session data. */
+       if ((PS(mod_data) || PS(mod_user_implemented)) && PS(gc_probability) > 0) {
+               int nrdels = -1;
 -                      PS(mod)->s_gc(&PS(mod_data), PS(gc_maxlifetime), &nrdels TSRMLS_CC);
++              nrand = (int) ((float) PS(gc_divisor) * php_combined_lcg());
+               if (nrand < PS(gc_probability)) {
 -                              php_error_docref(NULL TSRMLS_CC, E_NOTICE, "purged %d expired session objects", nrdels);
++                      PS(mod)->s_gc(&PS(mod_data), PS(gc_maxlifetime), &nrdels);
+ #ifdef SESSION_DEBUG
+                       if (nrdels != -1) {
 -static void php_session_initialize(TSRMLS_D) /* {{{ */
++                              php_error_docref(NULL, E_NOTICE, "purged %d expired session objects", nrdels);
+                       }
+ #endif
+               }
+       }
+ } /* }}} */
 +static void php_session_initialize(void) /* {{{ */
  {
 -      char *val = NULL;
 -      int vallen;
 +      zend_string *val = NULL;
  
        if (!PS(mod)) {
 -              php_error_docref(NULL TSRMLS_CC, E_ERROR, "No storage module chosen - failed to initialize session");
 +              php_error_docref(NULL, E_ERROR, "No storage module chosen - failed to initialize session");
                return;
        }
  
                if (PS(use_cookies)) {
                        PS(send_cookie) = 1;
                }
 +      } else if (PS(use_strict_mode) && PS(mod)->s_validate_sid &&
 +              PS(mod)->s_validate_sid(&PS(mod_data), PS(id)) == FAILURE) {
 +              if (PS(id)) {
 +                      zend_string_release(PS(id));
 +              }
 +              PS(id) = PS(mod)->s_create_sid(&PS(mod_data));
 +              if (!PS(id)) {
 +                      PS(id) = php_session_create_id(NULL);
 +              }
 +              if (PS(use_cookies)) {
 +                      PS(send_cookie) = 1;
 +              }
        }
  
 -      /* Set session ID for compatibility for older/3rd party save handlers */
 -      if (!PS(use_strict_mode)) {
 -              php_session_reset_id(TSRMLS_C);
 -              PS(session_status) = php_session_active;
 -      }
 +      php_session_reset_id();
 +      PS(session_status) = php_session_active;
  
+       /* GC must be done before read */
+       php_session_gc();
        /* Read data */
 -      php_session_track_init(TSRMLS_C);
 -      if (PS(mod)->s_read(&PS(mod_data), PS(id), &val, &vallen TSRMLS_CC) == FAILURE) {
 +      php_session_track_init();
 +      if (PS(mod)->s_read(&PS(mod_data), PS(id), &val, PS(gc_maxlifetime)) == FAILURE) {
                /* Some broken save handler implementation returns FAILURE for non-existent session ID */
                /* It's better to raise error for this, but disabled error for better compatibility */
                /*
@@@ -1508,13 -1510,18 +1533,12 @@@ PHPAPI void php_session_reset_id(void) 
  }
  /* }}} */
  
 -PHPAPI void php_session_start(TSRMLS_D) /* {{{ */
 +PHPAPI void php_session_start(void) /* {{{ */
  {
 -      zval **ppid;
 -      zval **data;
 +      zval *ppid;
 +      zval *data;
        char *p, *value;
-       int nrand;
 -      int lensess;
 -
 -      if (PS(use_only_cookies)) {
 -              PS(apply_trans_sid) = 0;
 -      } else {
 -              PS(apply_trans_sid) = PS(use_trans_sid);
 -      }
 +      size_t lensess;
  
        switch (PS(session_status)) {
                case php_session_active:
                PS(id) = NULL;
        }
  
-       /* GC must be done before reading session data. */
-       if ((PS(mod_data) || PS(mod_user_implemented)) && PS(gc_probability) > 0) {
-               int nrdels = -1;
-               nrand = (int) ((float) PS(gc_divisor) * php_combined_lcg());
-               if (nrand < PS(gc_probability)) {
-                       PS(mod)->s_gc(&PS(mod_data), PS(gc_maxlifetime), &nrdels);
- #ifdef SESSION_DEBUG
-                       if (nrdels != -1) {
-                               php_error_docref(NULL, E_NOTICE, "purged %d expired session objects", nrdels);
-                       }
- #endif
-               }
-       }
--      php_session_initialize(TSRMLS_C);
--      php_session_cache_limiter(TSRMLS_C);
++      php_session_initialize();
++      php_session_cache_limiter();
  }
  /* }}} */
  
index 56b8a67f2a9db45fc06cdc14d24bdff2f8fe1890,69238284095f6b56710943f0d36621d063eeaedd..67aa70c4af69a3324b12360aa9b3149f63f1179a
@@@ -52,9 -51,8 +52,9 @@@ ob_end_flush()
  *** Testing session_set_save_handler() : variation ***
  
  Open [%s,PHPSESSID]
- Read [%s,%s]
  GC [0]
 +1 deleted
+ Read [%s,%s]
  array(3) {
    ["Blah"]=>
    string(12) "Hello World!"
@@@ -67,20 -65,13 +67,12 @@@ Write [%s,%s,Blah|s:12:"Hello World!";F
  Close [%s,PHPSESSID]
  NULL
  Open [%s,PHPSESSID]
- Read [%s,%s]
  GC [0]
- array(3) {
-   ["Blah"]=>
-   string(12) "Hello World!"
-   ["Foo"]=>
-   bool(false)
-   ["Guff"]=>
-   int(1234567890)
 +1 deleted
+ Read [%s,%s]
+ array(0) {
  }
  Destroy [%s,%s]
--
--Warning: unlink(%s): No such file or directory in %s on line %d
  Close [%s,PHPSESSID]
  bool(true)