diff options
author | Sascha Schumann <sas@php.net> | 2002-10-02 21:51:32 +0000 |
---|---|---|
committer | Sascha Schumann <sas@php.net> | 2002-10-02 21:51:32 +0000 |
commit | 4ea4f294b62a91295baa4755ade52a7a3af652e5 (patch) | |
tree | 0da4933ad87392d89e2a9a9ba848c0c7fbab02e0 | |
parent | e4e71fe5ca675ef6c0e7db98d671ff7f7ede4fae (diff) | |
download | php-git-4ea4f294b62a91295baa4755ade52a7a3af652e5.tar.gz |
Fix harmless memory leaks and simplify track_vars_init.
-rw-r--r-- | ext/session/session.c | 31 |
1 files changed, 13 insertions, 18 deletions
diff --git a/ext/session/session.c b/ext/session/session.c index b981989f42..d3babffd74 100644 --- a/ext/session/session.c +++ b/ext/session/session.c @@ -258,7 +258,9 @@ void php_add_session_var(char *name, size_t namelen TSRMLS_DC) if (sym_global == NULL && sym_track == NULL) { zval *empty_var; - ALLOC_INIT_ZVAL(empty_var); + ALLOC_INIT_ZVAL(empty_var); /* this sets refcount to 1 */ + ZVAL_DELREF(empty_var); /* our module does not maintain a ref */ + /* The next call will increase refcount by NR_OF_SYM_TABLES==2 */ 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)); @@ -270,7 +272,7 @@ void php_add_session_var(char *name, size_t namelen TSRMLS_DC) 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))); + ZEND_SET_SYMBOL_WITH_LENGTH(Z_ARRVAL_P(PS(http_session_vars)), name, namelen+1, empty_var, 1, 0); } } } @@ -465,23 +467,16 @@ break_outer_loop: static void php_session_track_init(TSRMLS_D) { - zval **old_vars = NULL; + /* Unconditionally destroy existing arrays -- possible dirty data */ + zend_hash_del(&EG(symbol_table), "HTTP_SESSION_VARS", + sizeof("HTTP_SESSION_VARS")); + zend_hash_del(&EG(symbol_table), "_SESSION", sizeof("_SESSION")); - if (zend_hash_find(&EG(symbol_table), "HTTP_SESSION_VARS", sizeof("HTTP_SESSION_VARS"), (void **)&old_vars) == SUCCESS && Z_TYPE_PP(old_vars) == IS_ARRAY) { - PS(http_session_vars) = *old_vars; - zend_hash_clean(Z_ARRVAL_P(PS(http_session_vars))); - } else { - if(old_vars) { - zend_hash_del(&EG(symbol_table), "HTTP_SESSION_VARS", sizeof("HTTP_SESSION_VARS")); - zend_hash_del(&EG(symbol_table), "_SESSION", sizeof("_SESSION")); - } - MAKE_STD_ZVAL(PS(http_session_vars)); - array_init(PS(http_session_vars)); - PS(http_session_vars)->refcount = 2; - PS(http_session_vars)->is_ref = 1; - zend_hash_update(&EG(symbol_table), "HTTP_SESSION_VARS", sizeof("HTTP_SESSION_VARS"), &PS(http_session_vars), sizeof(zval *), NULL); - zend_hash_update(&EG(symbol_table), "_SESSION", sizeof("_SESSION"), &PS(http_session_vars), sizeof(zval *), NULL); - } + MAKE_STD_ZVAL(PS(http_session_vars)); + array_init(PS(http_session_vars)); + + ZEND_SET_GLOBAL_VAR("HTTP_SESSION_VARS", PS(http_session_vars)); + ZEND_SET_GLOBAL_VAR("_SESSION", PS(http_session_vars)); } static char *php_session_encode(int *newlen TSRMLS_DC) |