diff options
author | Sascha Schumann <sas@php.net> | 2002-10-01 11:59:45 +0000 |
---|---|---|
committer | Sascha Schumann <sas@php.net> | 2002-10-01 11:59:45 +0000 |
commit | 856cd5e17a368b5747130afe3e77fc4b2a5e6b4d (patch) | |
tree | b48dcbbb3975df318079e79260fc4668c14f1527 /ext/session/php_session.h | |
parent | 7cacf9713dba2e7c56f664c95499d4873d22fffc (diff) | |
download | php-git-856cd5e17a368b5747130afe3e77fc4b2a5e6b4d.tar.gz |
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.
Diffstat (limited to 'ext/session/php_session.h')
-rw-r--r-- | ext/session/php_session.h | 16 |
1 files changed, 7 insertions, 9 deletions
diff --git a/ext/session/php_session.h b/ext/session/php_session.h index 022f8df342..8cb02bfa64 100644 --- a/ext/session/php_session.h +++ b/ext/session/php_session.h @@ -174,6 +174,7 @@ typedef struct ps_serializer_struct { 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 int php_session_register_serializer(const char *name, 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 \ |