sas             Tue Oct  1 07:59:46 2002 EDT

  Modified files:              
    /php4/ext/session   php_session.h session.c 
  Log:
  The session extension ensures now that get_session_var can rely
  on the state of $_SESSION/$HTTP_SESSION_VARS. It does not look up
  symbols in the global symbol table anymore.
  
  This was achieved by actually planting references between every 
  $_SESSION["x"] and $x, not only when restoring a session, but also
  when registering a session variable (in a register_globals=1 context).
  
  Upon registering a new variable, this memory leak continues to show
  up, regardless of register_globals.
  
  ext/session/session.c(272) :  Freeing 0x0818F01C (12 bytes), script=test
  
  Obviously, the newly allocated empty zval is not properly freed.  If anyone
  has any idea on how to fix that, please step forward.
  
  
Index: php4/ext/session/php_session.h
diff -u php4/ext/session/php_session.h:1.81 php4/ext/session/php_session.h:1.82
--- php4/ext/session/php_session.h:1.81 Thu Aug 15 17:44:44 2002
+++ php4/ext/session/php_session.h      Tue Oct  1 07:59:45 2002
@@ -174,6 +174,7 @@
 
 PHPAPI void session_adapt_url(const char *, size_t, char **, size_t * TSRMLS_DC);
 
+void php_add_session_var(char *name, size_t namelen TSRMLS_DC);
 void php_set_session_var(char *name, size_t namelen, zval *state_val, 
php_unserialize_data_t *var_hash TSRMLS_DC);
 int php_get_session_var(char *name, size_t namelen, zval ***state_var TSRMLS_DC);
 
@@ -186,22 +187,19 @@
 PHPAPI void php_session_set_id(char *id TSRMLS_DC);
 PHPAPI void php_session_start(TSRMLS_D);
 
-#define PS_ADD_VARL(name,namelen)                                                     
                                 \
+#define PS_ADD_VARL(name,namelen) do {                                                
+                         \
        zend_hash_add_empty_element(&PS(vars), name, namelen + 1);                     
         \
-       if (PS(http_session_vars)) {                                                   
                                 \
-               zval *empty_var;                                                       
                                                 \
-                                                                                      
                                                                 \
-               ALLOC_INIT_ZVAL(empty_var);                                            
                                         \
-               zend_hash_add(Z_ARRVAL_P(PS(http_session_vars)), name, namelen+1, 
&empty_var, sizeof(zval *), NULL);    \
-       }
+       php_add_session_var(name, namelen TSRMLS_CC);                                  
+                 \
+} while (0)
 
 #define PS_ADD_VAR(name) PS_ADD_VARL(name, strlen(name))
 
-#define PS_DEL_VARL(name,namelen)                                                     
                                 \
+#define PS_DEL_VARL(name,namelen) do {                                                
+                         \
        zend_hash_del(&PS(vars), name, namelen+1);                                     
                         \
        if (PS(http_session_vars)) {                                                   
                                 \
                zend_hash_del(Z_ARRVAL_P(PS(http_session_vars)), name, namelen+1);     
 \
-       }
+       }                                                                              
+                                                                 \
+} while (0)
 
 
 #define PS_ENCODE_VARS                                                                
                         \
Index: php4/ext/session/session.c
diff -u php4/ext/session/session.c:1.322 php4/ext/session/session.c:1.323
--- php4/ext/session/session.c:1.322    Sun Sep 29 15:28:12 2002
+++ php4/ext/session/session.c  Tue Oct  1 07:59:45 2002
@@ -17,7 +17,7 @@
    +----------------------------------------------------------------------+
  */
 
-/* $Id: session.c,v 1.322 2002/09/29 19:28:12 sniper Exp $ */
+/* $Id: session.c,v 1.323 2002/10/01 11:59:45 sas Exp $ */
 
 #ifdef HAVE_CONFIG_H
 #include "config.h"
@@ -238,6 +238,43 @@
 
 #define MAX_STR 512
 
+void php_add_session_var(char *name, size_t namelen TSRMLS_DC)
+{
+       zval **sym_track = NULL;
+       
+       zend_hash_find(Z_ARRVAL_P(PS(http_session_vars)), name, namelen + 1, 
+                       (void *) &sym_track);
+
+       /*
+        * Set up a proper reference between $_SESSION["x"] and $x.
+        */
+
+       if (PG(register_globals)) {
+               zval **sym_global = NULL;
+               
+               zend_hash_find(&EG(symbol_table), name, namelen + 1, 
+                               (void *) &sym_global);
+                               
+               if (sym_global == NULL && sym_track == NULL) {
+                       zval *empty_var;
+
+                       ALLOC_INIT_ZVAL(empty_var);
+                       zend_set_hash_symbol(empty_var, name, namelen, 1, 2, 
+Z_ARRVAL_P(PS(http_session_vars)), &EG(symbol_table));
+               } else if (sym_global == NULL) {
+                       zend_set_hash_symbol(*sym_track, name, namelen, 1, 1, 
+&EG(symbol_table));
+               } else if (sym_track == NULL) {
+                       zend_set_hash_symbol(*sym_global, name, namelen, 1, 1, 
+Z_ARRVAL_P(PS(http_session_vars)));
+               }
+       } else {
+               if (sym_track == NULL) {
+                       zval *empty_var;
+       
+                       ALLOC_INIT_ZVAL(empty_var);
+                       zend_set_hash_symbol(empty_var, name, namelen, 0, 1, 
+Z_ARRVAL_P(PS(http_session_vars)));
+               }
+       }
+}
+
 void php_set_session_var(char *name, size_t namelen, zval *state_val, 
php_unserialize_data_t *var_hash TSRMLS_DC)
 {
        if (PG(register_globals)) {
@@ -273,23 +310,11 @@
 
 int php_get_session_var(char *name, size_t namelen, zval ***state_var TSRMLS_DC)
 {
-       /*
-        * If register_globals is set, the global variable is preferred.
-        *
-        * If it is not set and track vars are available, track vars are used.
-        */
-       
-       if (PG(register_globals)) {
-               return zend_hash_find(&EG(symbol_table), name, namelen+1, (void **) 
state_var);
-       }
-       
-       if (PS(http_session_vars)) {
-               if (zend_hash_find(Z_ARRVAL_P(PS(http_session_vars)), name, namelen+1, 
(void **) state_var)==SUCCESS) {
-                       return SUCCESS;
-               }
+       if (PS(http_session_vars) && PS(http_session_vars)->type == IS_ARRAY) {
+               return zend_hash_find(Z_ARRVAL_P(PS(http_session_vars)), name, 
+                               namelen+1, (void **) state_var);
        }
        
-       /* register_globals is disabled, but we don't have http_session_vars */
        return FAILURE;
 }
 
@@ -588,7 +613,7 @@
                for 
(zend_hash_internal_pointer_reset_ex(Z_ARRVAL_P(PS(http_session_vars)), &pos);
                                
zend_hash_get_current_key_ex(Z_ARRVAL_P(PS(http_session_vars)), &variable, 
&variable_len, &num_key, 0, &pos) == HASH_KEY_IS_STRING;
                                
zend_hash_move_forward_ex(Z_ARRVAL_P(PS(http_session_vars)),&pos)) {
-                       PS_ADD_VARL(variable,variable_len-1);
+                       PS_ADD_VARL(variable, variable_len-1);
                }
        }
 



-- 
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to