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