scottmac Tue Apr 29 14:42:38 2008 UTC
Modified files: (Branch: PHP_5_2)
/php-src NEWS
/php-src/ext/session session.c
Log:
MFH Fixed bug #44720 (Prevent infinite recursion within session_register)
http://cvs.php.net/viewvc.cgi/php-src/NEWS?r1=1.2027.2.547.2.1145&r2=1.2027.2.547.2.1146&diff_format=u
Index: php-src/NEWS
diff -u php-src/NEWS:1.2027.2.547.2.1145 php-src/NEWS:1.2027.2.547.2.1146
--- php-src/NEWS:1.2027.2.547.2.1145 Fri Apr 18 01:00:56 2008
+++ php-src/NEWS Tue Apr 29 14:42:38 2008
@@ -2,9 +2,10 @@
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
?? Apr 2008, PHP 5.2.6
- Fixed two possible crashes inside posix extension (Tony)
+- Fixed bug #44742 (timezone_offset_get() causes segmentation faults). (Derick)
+- Fixed bug #44720 (Prevent crash within session_register()). (Scott)
- Fixed bug #44703 (htmlspecialchars() does not detect bad character set
argument). (Andy Wharmby)
-- Fixed bug #44742 (timezone_offset_get() causes segmentation faults). (Derick)
10 Apr 2008, PHP 5.2.6RC5
- Fixed incorrect heredoc handling when label is used within the block.
http://cvs.php.net/viewvc.cgi/php-src/ext/session/session.c?r1=1.417.2.8.2.41&r2=1.417.2.8.2.42&diff_format=u
Index: php-src/ext/session/session.c
diff -u php-src/ext/session/session.c:1.417.2.8.2.41
php-src/ext/session/session.c:1.417.2.8.2.42
--- php-src/ext/session/session.c:1.417.2.8.2.41 Mon Dec 31 07:20:10 2007
+++ php-src/ext/session/session.c Tue Apr 29 14:42:38 2008
@@ -17,7 +17,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: session.c,v 1.417.2.8.2.41 2007/12/31 07:20:10 sebastian Exp $ */
+/* $Id: session.c,v 1.417.2.8.2.42 2008/04/29 14:42:38 scottmac Exp $ */
#ifdef HAVE_CONFIG_H
#include "config.h"
@@ -78,7 +78,7 @@
PHP_FE(session_get_cookie_params, NULL)
PHP_FE(session_write_close, NULL)
PHP_FALIAS(session_commit, session_write_close, NULL)
- {NULL, NULL, NULL}
+ {NULL, NULL, NULL}
};
/* }}} */
@@ -232,7 +232,7 @@
#define IF_SESSION_VARS() \
if (PS(http_session_vars) && PS(http_session_vars)->type == IS_ARRAY)
-PHPAPI int php_session_register_serializer(const char *name,
+PHPAPI int php_session_register_serializer(const char *name,
int (*encode)(PS_SERIALIZER_ENCODE_ARGS),
int (*decode)(PS_SERIALIZER_DECODE_ARGS))
{
@@ -263,9 +263,9 @@
ps_modules[i] = ptr;
ret = 0;
break;
- }
+ }
}
-
+
return ret;
}
@@ -316,7 +316,7 @@
zval **sym_track = NULL;
IF_SESSION_VARS() {
- zend_hash_find(Z_ARRVAL_P(PS(http_session_vars)), name, namelen
+ 1,
+ zend_hash_find(Z_ARRVAL_P(PS(http_session_vars)), name, namelen
+ 1,
(void *) &sym_track);
} else {
return;
@@ -328,8 +328,8 @@
if (PG(register_globals)) {
zval **sym_global = NULL;
-
- if (zend_hash_find(&EG(symbol_table), name, namelen + 1, (void
*) &sym_global) == SUCCESS) {
+
+ if (zend_hash_find(&EG(symbol_table), name, namelen + 1, (void
*) &sym_global) == SUCCESS) {
if ((Z_TYPE_PP(sym_global) == IS_ARRAY &&
Z_ARRVAL_PP(sym_global) == &EG(symbol_table)) || *sym_global ==
PS(http_session_vars)) {
return;
}
@@ -352,7 +352,7 @@
} else {
if (sym_track == NULL) {
zval *empty_var;
-
+
ALLOC_INIT_ZVAL(empty_var);
ZEND_SET_SYMBOL_WITH_LENGTH(Z_ARRVAL_P(PS(http_session_vars)), name, namelen+1,
empty_var, 1, 0);
}
@@ -363,12 +363,12 @@
{
if (PG(register_globals)) {
zval **old_symbol;
- if (zend_hash_find(&EG(symbol_table),name,namelen+1,(void
*)&old_symbol) == SUCCESS) {
+ if (zend_hash_find(&EG(symbol_table),name,namelen+1,(void
*)&old_symbol) == SUCCESS) {
if ((Z_TYPE_PP(old_symbol) == IS_ARRAY &&
Z_ARRVAL_PP(old_symbol) == &EG(symbol_table)) || *old_symbol ==
PS(http_session_vars)) {
return;
}
- /*
+ /*
* A global symbol with the same name exists already.
That
* symbol might have been created by other means (e.g.
$_GET).
*
@@ -380,12 +380,12 @@
* session-vars won't work because of this very reason!
*/
-
+
REPLACE_ZVAL_VALUE(old_symbol,state_val,1);
/*
* The following line will update the reference table
used for
- * unserialization. It is optional, because some
storage
+ * unserialization. It is optional, because some
storage
* formats may not be able to represent references.
*/
@@ -407,7 +407,7 @@
int ret = FAILURE;
IF_SESSION_VARS() {
- ret = zend_hash_find(Z_ARRVAL_P(PS(http_session_vars)), name,
+ ret = zend_hash_find(Z_ARRVAL_P(PS(http_session_vars)), name,
namelen+1, (void **) state_var);
/*
@@ -417,8 +417,8 @@
* if the global var exists, then
* we prefer the same key in the global sym table
*/
-
- if (PG(register_globals) && ret == SUCCESS
+
+ if (PG(register_globals) && ret == SUCCESS
&& Z_TYPE_PP(*state_var) == IS_NULL) {
zval **tmp;
@@ -428,7 +428,7 @@
}
}
}
-
+
return ret;
}
@@ -448,14 +448,14 @@
if (key_length > PS_BIN_MAX) continue;
smart_str_appendc(&buf, (unsigned char) key_length);
smart_str_appendl(&buf, key, key_length);
-
+
php_var_serialize(&buf, struc, &var_hash TSRMLS_CC);
} else {
if (key_length > PS_BIN_MAX) continue;
smart_str_appendc(&buf, (unsigned char) (key_length &
PS_BIN_UNDEF));
smart_str_appendl(&buf, key, key_length);
);
-
+
if (newlen) *newlen = buf.len;
*newstr = buf.c;
PHP_VAR_SERIALIZE_DESTROY(var_hash);
@@ -527,18 +527,18 @@
smart_str_appendl(&buf, key, key_length);
if (memchr(key, PS_DELIMITER, key_length)) {
PHP_VAR_SERIALIZE_DESTROY(var_hash);
- smart_str_free(&buf);
+ smart_str_free(&buf);
return FAILURE;
}
smart_str_appendc(&buf, PS_DELIMITER);
-
+
php_var_serialize(&buf, struc, &var_hash TSRMLS_CC);
} else {
smart_str_appendc(&buf, PS_UNDEF_MARKER);
smart_str_appendl(&buf, key, key_length);
smart_str_appendc(&buf, PS_DELIMITER);
);
-
+
if (newlen) *newlen = buf.len;
*newstr = buf.c;
@@ -546,7 +546,7 @@
return SUCCESS;
}
-PS_SERIALIZER_DECODE_FUNC(php)
+PS_SERIALIZER_DECODE_FUNC(php)
{
const char *p, *q;
char *name;
@@ -565,14 +565,14 @@
q = p;
while (*q != PS_DELIMITER)
if (++q >= endptr) goto break_outer_loop;
-
+
if (p[0] == PS_UNDEF_MARKER) {
p++;
has_value = 0;
} else {
has_value = 1;
}
-
+
namelen = q - p;
name = estrndup(p, namelen);
q++;
@@ -596,7 +596,7 @@
p = q;
}
break_outer_loop:
-
+
PHP_VAR_UNSERIALIZE_DESTROY(var_hash);
return SUCCESS;
@@ -605,7 +605,7 @@
static void php_session_track_init(TSRMLS_D)
{
zval *session_vars = NULL;
-
+
/* Unconditionally destroy existing arrays -- possible dirty data */
zend_delete_global_variable("HTTP_SESSION_VARS",
sizeof("HTTP_SESSION_VARS")-1 TSRMLS_CC);
zend_delete_global_variable("_SESSION", sizeof("_SESSION")-1 TSRMLS_CC);
@@ -617,7 +617,7 @@
MAKE_STD_ZVAL(session_vars);
array_init(session_vars);
PS(http_session_vars) = session_vars;
-
+
if (PG(register_long_arrays)) {
ZEND_SET_GLOBAL_VAR_WITH_LENGTH("HTTP_SESSION_VARS",
sizeof("HTTP_SESSION_VARS"), PS(http_session_vars), 3, 1);
ZEND_SET_GLOBAL_VAR_WITH_LENGTH("_SESSION", sizeof("_SESSION"),
PS(http_session_vars), 3, 1);
@@ -678,14 +678,14 @@
unsigned short w;
int mask;
int have;
-
+
p = (unsigned char *) in;
q = (unsigned char *)in + inlen;
w = 0;
have = 0;
mask = (1 << nbits) - 1;
-
+
while (1) {
if (have < nbits) {
if (p < q) {
@@ -704,7 +704,7 @@
w >>= nbits;
have -= nbits;
}
-
+
*out = '\0';
return out;
}
@@ -723,7 +723,7 @@
char *remote_addr = NULL;
gettimeofday(&tv, NULL);
-
+
if (zend_hash_find(&EG(symbol_table), "_SERVER",
sizeof("_SERVER"), (void **) &array) == SUCCESS
&&
Z_TYPE_PP(array) == IS_ARRAY &&
@@ -732,8 +732,8 @@
remote_addr = Z_STRVAL_PP(token);
}
- /* maximum 15+19+19+10 bytes */
- spprintf(&buf, 0, "%.15s%ld%ld%0.8F", remote_addr ? remote_addr : "",
+ /* maximum 15+19+19+10 bytes */
+ spprintf(&buf, 0, "%.15s%ld%ld%0.8F", remote_addr ? remote_addr : "",
tv.tv_sec, (long int)tv.tv_usec,
php_combined_lcg(TSRMLS_C) * 10);
switch (PS(hash_func)) {
@@ -761,11 +761,11 @@
unsigned char rbuf[2048];
int n;
int to_read = PS(entropy_length);
-
+
while (to_read > 0) {
n = read(fd, rbuf, MIN(to_read, sizeof(rbuf)));
if (n <= 0) break;
-
+
switch (PS(hash_func)) {
case PS_HASH_FUNC_MD5:
PHP_MD5Update(&md5_context, rbuf, n);
@@ -796,8 +796,8 @@
php_error_docref(NULL TSRMLS_CC, E_WARNING, "The ini setting
hash_bits_per_character is out of range (should be 4, 5, or 6) - using 4 for
now");
}
j = (int) (bin_to_readable((char *)digest, digest_len, buf,
PS(hash_bits_per_character)) - buf);
-
- if (newlen)
+
+ if (newlen)
*newlen = j;
return buf;
}
@@ -823,7 +823,7 @@
php_error_docref(NULL TSRMLS_CC, E_ERROR, "Failed to initialize
storage module: %s (path: %s)", PS(mod)->s_name, PS(save_path));
return;
}
-
+
/* If there is no ID, use session module to create one */
if (!PS(id)) {
new_session:
@@ -832,7 +832,7 @@
PS(send_cookie) = 1;
}
}
-
+
/* Read data */
/* Question: if you create a SID here, should you also try to read data?
* I'm not sure, but while not doing so will remove one session
operation
@@ -860,15 +860,15 @@
int n;
zval **val;
int ret = 0;
-
+
n = zend_hash_get_current_key_ex(ht, &str, &str_len, &num_key, 0, pos);
switch (n) {
case HASH_KEY_IS_STRING:
- if (zend_hash_find(&EG(symbol_table), str, str_len,
- (void **) &val) == SUCCESS
+ if (zend_hash_find(&EG(symbol_table), str, str_len,
+ (void **) &val) == SUCCESS
&& val && Z_TYPE_PP(val) != IS_NULL) {
- ZEND_SET_SYMBOL_WITH_LENGTH(ht, str, str_len,
*val,
+ ZEND_SET_SYMBOL_WITH_LENGTH(ht, str, str_len,
*val,
(*val)->refcount + 1 , 1);
ret = 1;
}
@@ -879,14 +879,14 @@
"numeric nature.", num_key);
break;
}
-
+
return ret;
}
static void php_session_save_current_state(TSRMLS_D)
{
int ret = FAILURE;
-
+
IF_SESSION_VARS() {
if (PS(bug_compat) && !PG(register_globals)) {
HashTable *ht = Z_ARRVAL_P(PS(http_session_vars));
@@ -896,7 +896,7 @@
zend_hash_internal_pointer_reset_ex(ht, &pos);
- while (zend_hash_get_current_data_ex(ht,
+ while (zend_hash_get_current_data_ex(ht,
(void **) &val, &pos) !=
FAILURE) {
if (Z_TYPE_PP(val) == IS_NULL) {
if (migrate_global(ht, &pos TSRMLS_CC))
@@ -930,7 +930,7 @@
PS(mod)->s_name,
PS(save_path));
}
-
+
if (PS(mod_data))
PS(mod)->s_close(&PS(mod_data) TSRMLS_CC);
}
@@ -949,18 +949,18 @@
char buf[MAX_STR];
struct tm tm, *res;
int n;
-
+
res = php_gmtime_r(when, &tm);
if (!res) {
buf[0] = '\0';
return;
}
-
+
n = slprintf(buf, sizeof(buf), "%s, %02d %s %d %02d:%02d:%02d GMT", /*
SAFE */
- week_days[tm.tm_wday], tm.tm_mday,
- month_names[tm.tm_mon], tm.tm_year + 1900,
- tm.tm_hour, tm.tm_min,
+ week_days[tm.tm_wday], tm.tm_mday,
+ month_names[tm.tm_mon], tm.tm_year + 1900,
+ tm.tm_hour, tm.tm_min,
tm.tm_sec);
memcpy(ubuf, buf, n);
ubuf[n] = '\0';
@@ -971,7 +971,7 @@
const char *path;
struct stat sb;
char buf[MAX_STR + 1];
-
+
path = SG(request_info).path_translated;
if (path) {
if (VCWD_STAT(path, &sb) == -1) {
@@ -994,24 +994,24 @@
char buf[MAX_STR + 1];
struct timeval tv;
time_t now;
-
+
gettimeofday(&tv, NULL);
now = tv.tv_sec + PS(cache_expire) * 60;
#define EXPIRES "Expires: "
memcpy(buf, EXPIRES, sizeof(EXPIRES) - 1);
strcpy_gmt(buf + sizeof(EXPIRES) - 1, &now);
ADD_HEADER(buf);
-
+
snprintf(buf, sizeof(buf) , "Cache-Control: public, max-age=%ld",
PS(cache_expire) * 60); /* SAFE */
ADD_HEADER(buf);
-
+
last_modified(TSRMLS_C);
}
CACHE_LIMITER_FUNC(private_no_expire)
{
char buf[MAX_STR + 1];
-
+
snprintf(buf, sizeof(buf), "Cache-Control: private, max-age=%ld,
pre-check=%ld", PS(cache_expire) * 60, PS(cache_expire) * 60); /* SAFE */
ADD_HEADER(buf);
@@ -1046,7 +1046,7 @@
php_session_cache_limiter_t *lim;
if (PS(cache_limiter)[0] == '\0') return 0;
-
+
if (SG(headers_sent)) {
char *output_start_filename =
php_get_output_start_filename(TSRMLS_C);
int output_start_lineno = php_get_output_start_lineno(TSRMLS_C);
@@ -1056,10 +1056,10 @@
output_start_filename, output_start_lineno);
} else {
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Cannot
send session cache limiter - headers already sent");
- }
+ }
return -2;
}
-
+
for (lim = php_session_cache_limiters; lim->name; lim++) {
if (!strcasecmp(lim->name, PS(cache_limiter))) {
lim->func(TSRMLS_C);
@@ -1092,10 +1092,10 @@
output_start_filename, output_start_lineno);
} else {
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Cannot
send session cookie - headers already sent");
- }
+ }
return;
}
-
+
/* URL encode session_name and id because they might be user supplied */
e_session_name = php_url_encode(PS(session_name),
strlen(PS(session_name)), NULL);
e_id = php_url_encode(PS(id), strlen(PS(id)), NULL);
@@ -1104,17 +1104,17 @@
smart_str_appends(&ncookie, e_session_name);
smart_str_appendc(&ncookie, '=');
smart_str_appends(&ncookie, e_id);
-
+
efree(e_session_name);
efree(e_id);
-
+
if (PS(cookie_lifetime) > 0) {
struct timeval tv;
time_t t;
-
+
gettimeofday(&tv, NULL);
t = tv.tv_sec + PS(cookie_lifetime);
-
+
if (t > 0) {
date_fmt = php_std_date(t TSRMLS_CC);
smart_str_appends(&ncookie, COOKIE_EXPIRES);
@@ -1127,7 +1127,7 @@
smart_str_appends(&ncookie, COOKIE_PATH);
smart_str_appends(&ncookie, PS(cookie_path));
}
-
+
if (PS(cookie_domain)[0]) {
smart_str_appends(&ncookie, COOKIE_DOMAIN);
smart_str_appends(&ncookie, PS(cookie_domain));
@@ -1142,7 +1142,7 @@
}
smart_str_0(&ncookie);
-
+
/* 'replace' must be 0 here, else a previous Set-Cookie
header, probably sent with setcookie() will be replaced! */
sapi_add_header_ex(ncookie.c, ncookie.len, 0, 0 TSRMLS_CC);
@@ -1159,7 +1159,7 @@
ret = *mod;
break;
}
-
+
return ret;
}
@@ -1184,7 +1184,7 @@
static void php_session_reset_id(TSRMLS_D)
{
int module_number = PS(module_number);
-
+
if (PS(use_cookies) && PS(send_cookie)) {
php_session_send_cookie(TSRMLS_C);
PS(send_cookie) = 0;
@@ -1192,7 +1192,7 @@
/* if the SID constant exists, destroy it. */
zend_hash_del(EG(zend_constants), "sid", sizeof("sid"));
-
+
if (PS(define_sid)) {
smart_str var = {0};
@@ -1210,7 +1210,7 @@
php_url_scanner_add_var(PS(session_name),
strlen(PS(session_name)), PS(id), strlen(PS(id)), 1 TSRMLS_CC);
}
}
-
+
PHPAPI void php_session_start(TSRMLS_D)
{
zval **ppid;
@@ -1226,8 +1226,8 @@
char *value;
value = zend_ini_string("session.save_handler",
sizeof("session.save_handler"), 0);
-
- if (value) {
+
+ if (value) {
php_error_docref(NULL TSRMLS_CC, E_WARNING,
"Cannot find save handler %s", value);
}
else {
@@ -1235,7 +1235,7 @@
}
return;
}
-
+
php_error(E_NOTICE, "A session had already been started -
ignoring session_start()");
return;
} else {
@@ -1244,11 +1244,11 @@
}
lensess = strlen(PS(session_name));
-
+
/*
* Cookies are preferred, because initially
- * cookie and get variables will be available.
+ * cookie and get variables will be available.
*/
if (!PS(id)) {
@@ -1306,7 +1306,7 @@
/* check whether the current request was referred to by
an external site which invalidates the previously found id */
-
+
if (PS(id) &&
PS(extern_referer_chk)[0] != '\0' &&
PG(http_globals)[TRACK_VARS_SERVER] &&
@@ -1321,9 +1321,9 @@
if (PS(use_trans_sid))
PS(apply_trans_sid) = 1;
}
-
+
php_session_initialize(TSRMLS_C);
-
+
if (!PS(use_cookies) && PS(send_cookie)) {
if (PS(use_trans_sid))
PS(apply_trans_sid) = 1;
@@ -1331,7 +1331,7 @@
}
php_session_reset_id(TSRMLS_C);
-
+
PS(session_status) = php_session_active;
php_session_cache_limiter(TSRMLS_C);
@@ -1363,7 +1363,7 @@
retval = FAILURE;
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Session object
destruction failed");
}
-
+
php_rshutdown_session_globals(TSRMLS_C);
php_rinit_session_globals(TSRMLS_C);
@@ -1408,7 +1408,7 @@
/* }}} */
/* {{{ proto array session_get_cookie_params(void)
- Return the session cookie parameters */
+ Return the session cookie parameters */
PHP_FUNCTION(session_get_cookie_params)
{
if (ZEND_NUM_ARGS() != 0) {
@@ -1435,14 +1435,14 @@
if (ac < 0 || ac > 1 || zend_get_parameters_ex(ac, &p_name) == FAILURE)
WRONG_PARAM_COUNT;
-
+
old = estrdup(PS(session_name));
if (ac == 1) {
convert_to_string_ex(p_name);
zend_alter_ini_entry("session.name", sizeof("session.name"),
Z_STRVAL_PP(p_name), Z_STRLEN_PP(p_name), PHP_INI_USER, PHP_INI_STAGE_RUNTIME);
}
-
+
RETVAL_STRING(old, 0);
}
/* }}} */
@@ -1464,7 +1464,7 @@
} else {
RETVAL_EMPTY_STRING();
}
-
+
if (ac == 1) {
convert_to_string_ex(p_name);
if (!_php_find_ps_module(Z_STRVAL_PP(p_name) TSRMLS_CC)) {
@@ -1494,10 +1494,10 @@
if (ZEND_NUM_ARGS() != 6 || zend_get_parameters_array_ex(6, args) ==
FAILURE)
WRONG_PARAM_COUNT;
-
- if (PS(session_status) != php_session_none)
+
+ if (PS(session_status) != php_session_none)
RETURN_FALSE;
-
+
for (i = 0; i < 6; i++) {
if (!zend_is_callable(*args[i], 0, &name)) {
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Argument
%d is not a valid callback", i+1);
@@ -1506,18 +1506,18 @@
}
efree(name);
}
-
+
zend_alter_ini_entry("session.save_handler",
sizeof("session.save_handler"), "user", sizeof("user")-1, PHP_INI_USER,
PHP_INI_STAGE_RUNTIME);
mdata = emalloc(sizeof(*mdata));
-
+
for (i = 0; i < 6; i++) {
ZVAL_ADDREF(*args[i]);
mdata->names[i] = *args[i];
}
PS(mod_data) = (void *) mdata;
-
+
RETURN_TRUE;
}
/* }}} */
@@ -1532,14 +1532,14 @@
if (ac < 0 || ac > 1 || zend_get_parameters_ex(ac, &p_name) == FAILURE)
WRONG_PARAM_COUNT;
-
+
old = estrdup(PS(save_path));
if (ac == 1) {
convert_to_string_ex(p_name);
zend_alter_ini_entry("session.save_path",
sizeof("session.save_path"), Z_STRVAL_PP(p_name), Z_STRLEN_PP(p_name),
PHP_INI_USER, PHP_INI_STAGE_RUNTIME);
}
-
+
RETVAL_STRING(old, 0);
}
/* }}} */
@@ -1566,7 +1566,7 @@
if (PS(id)) efree(PS(id));
PS(id) = estrndup(Z_STRVAL_PP(p_name), Z_STRLEN_PP(p_name));
}
-
+
RETVAL_STRING(old, 0);
}
/* }}} */
@@ -1595,12 +1595,12 @@
efree(PS(id));
PS(id) = NULL;
}
-
+
PS(id) = PS(mod)->s_create_sid(&PS(mod_data), NULL TSRMLS_CC);
PS(send_cookie) = 1;
php_session_reset_id(TSRMLS_C);
-
+
RETURN_TRUE;
}
RETURN_FALSE;
@@ -1617,14 +1617,14 @@
if (ac < 0 || ac > 1 || zend_get_parameters_ex(ac, &p_cache_limiter) ==
FAILURE)
WRONG_PARAM_COUNT;
-
+
old = estrdup(PS(cache_limiter));
if (ac == 1) {
convert_to_string_ex(p_cache_limiter);
zend_alter_ini_entry("session.cache_limiter",
sizeof("session.cache_limiter"), Z_STRVAL_PP(p_cache_limiter),
Z_STRLEN_PP(p_cache_limiter), PHP_INI_USER, PHP_INI_STAGE_RUNTIME);
}
-
+
RETVAL_STRING(old, 0);
}
/* }}} */
@@ -1655,14 +1655,21 @@
static void php_register_var(zval** entry TSRMLS_DC)
{
zval **value;
-
+
if (Z_TYPE_PP(entry) == IS_ARRAY) {
+ if (Z_ARRVAL_PP(entry)->nApplyCount > 1) {
+ return;
+ }
+
zend_hash_internal_pointer_reset(Z_ARRVAL_PP(entry));
+ Z_ARRVAL_PP(entry)->nApplyCount++;
while (zend_hash_get_current_data(Z_ARRVAL_PP(entry),
(void**)&value) == SUCCESS) {
php_register_var(value TSRMLS_CC);
zend_hash_move_forward(Z_ARRVAL_PP(entry));
}
+
+ Z_ARRVAL_PP(entry)->nApplyCount--;
} else {
convert_to_string_ex(entry);
@@ -1686,7 +1693,7 @@
RETURN_FALSE
else
args = (zval ***)safe_emalloc(argc, sizeof(zval **), 0);
-
+
if (zend_get_parameters_array_ex(argc, args) == FAILURE) {
efree(args);
WRONG_PARAM_COUNT;
@@ -1695,20 +1702,20 @@
if (PS(session_status) == php_session_none || PS(session_status) ==
php_session_disabled) {
php_session_start(TSRMLS_C);
}
-
+
if (PS(session_status) == php_session_disabled) {
efree(args);
RETURN_FALSE;
}
-
+
for (i = 0; i < argc; i++) {
if (Z_TYPE_PP(args[i]) == IS_ARRAY)
SEPARATE_ZVAL(args[i]);
php_register_var(args[i] TSRMLS_CC);
- }
-
+ }
+
efree(args);
-
+
RETURN_TRUE;
}
/* }}} */
@@ -1722,9 +1729,9 @@
if (ac != 1 || zend_get_parameters_ex(ac, &p_name) == FAILURE)
WRONG_PARAM_COUNT;
-
+
convert_to_string_ex(p_name);
-
+
PS_DEL_VARL(Z_STRVAL_PP(p_name), Z_STRLEN_PP(p_name));
RETURN_TRUE;
@@ -1741,15 +1748,15 @@
if (ac != 1 || zend_get_parameters_ex(ac, &p_name) == FAILURE)
WRONG_PARAM_COUNT;
-
+
convert_to_string_ex(p_name);
-
+
if (PS(session_status) == php_session_none)
RETURN_FALSE;
IF_SESSION_VARS() {
- if (zend_hash_find(Z_ARRVAL_P(PS(http_session_vars)),
- Z_STRVAL_PP(p_name),
Z_STRLEN_PP(p_name)+1,
+ if (zend_hash_find(Z_ARRVAL_P(PS(http_session_vars)),
+ Z_STRVAL_PP(p_name),
Z_STRLEN_PP(p_name)+1,
(void **)&p_var) == SUCCESS) {
RETURN_TRUE;
}
@@ -1773,7 +1780,7 @@
if (enc == NULL) {
RETURN_FALSE;
}
-
+
RETVAL_STRINGL(enc, len, 0);
}
/* }}} */
@@ -1795,7 +1802,7 @@
convert_to_string_ex(str);
php_session_decode(Z_STRVAL_PP(str), Z_STRLEN_PP(str) TSRMLS_CC);
-
+
RETURN_TRUE;
}
/* }}} */
@@ -1842,16 +1849,16 @@
char *str;
ulong num_key;
HashPosition pos;
-
+
zend_hash_internal_pointer_reset_ex(ht, &pos);
- while (zend_hash_get_current_key_ex(ht, &str, &str_len,
&num_key,
+ while (zend_hash_get_current_key_ex(ht, &str, &str_len,
&num_key,
0, &pos) == HASH_KEY_IS_STRING)
{
zend_delete_global_variable(str, str_len-1
TSRMLS_CC);
zend_hash_move_forward_ex(ht, &pos);
}
}
-
+
/* Clean $_SESSION. */
zend_hash_clean(ht);
}
@@ -1866,7 +1873,7 @@
}
static void php_rinit_session_globals(TSRMLS_D)
-{
+{
PS(id) = NULL;
PS(session_status) = php_session_none;
PS(mod_data) = NULL;
@@ -1990,7 +1997,7 @@
smart_str save_handlers = {0};
smart_str ser_handlers = {0};
int i;
-
+
/* Get save handlers */
for (i = 0, mod = ps_modules; i < MAX_MODULES; i++, mod++) {
if (*mod && (*mod)->s_name) {
@@ -2006,7 +2013,7 @@
smart_str_appendc(&ser_handlers, ' ');
}
}
-
+
php_info_print_table_start();
php_info_print_table_row(2, "Session Support", "enabled" );
--
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php