MFH: ws + sync

This commit is contained in:
Jani Taskinen 2009-05-18 16:10:09 +00:00
parent 82c49a50f4
commit 9ece649f7c
5 changed files with 201 additions and 229 deletions

View file

@ -125,7 +125,7 @@ static char *ps_files_path_create(char *buf, size_t buflen, ps_files *data, cons
}
#ifndef O_BINARY
#define O_BINARY 0
# define O_BINARY 0
#endif
static void ps_files_close(ps_files *data)
@ -183,7 +183,6 @@ static void ps_files_open(ps_files *data, const char *key TSRMLS_DC)
(PG(safe_mode) && !php_checkuid(buf, NULL, CHECKUID_CHECK_FILE_AND_DIR))
)
) {
close(data->fd);
return;
}
@ -200,8 +199,7 @@ static void ps_files_open(ps_files *data, const char *key TSRMLS_DC)
}
#endif
} else {
php_error_docref(NULL TSRMLS_CC, E_WARNING, "open(%s, O_RDWR) failed: %s (%d)", buf,
strerror(errno), errno);
php_error_docref(NULL TSRMLS_CC, E_WARNING, "open(%s, O_RDWR) failed: %s (%d)", buf, strerror(errno), errno);
}
}
}
@ -316,8 +314,7 @@ PS_OPEN_FUNC(files)
}
save_path = argv[argc - 1];
data = emalloc(sizeof(*data));
memset(data, 0, sizeof(*data));
data = ecalloc(1, sizeof(*data));
data->fd = -1;
data->dirdepth = dirdepth;
@ -401,10 +398,7 @@ PS_WRITE_FUNC(files)
return FAILURE;
}
/*
* truncate file, if the amount of new data is smaller than
* the existing data set.
*/
/* Truncate file if the amount of new data is smaller than the existing data set. */
if (vallen < (int)data->st_size) {
ftruncate(data->fd, 0);
@ -443,8 +437,7 @@ PS_DESTROY_FUNC(files)
if (VCWD_UNLINK(buf) == -1) {
/* This is a little safety check for instances when we are dealing with a regenerated session
* that was not yet written to disk
*/
* that was not yet written to disk. */
if (!VCWD_ACCESS(buf, F_OK)) {
return FAILURE;
}

View file

@ -42,9 +42,7 @@
/* For php_uint32 */
#include "ext/standard/basic_functions.h"
/*
* this list holds all data associated with one session
*/
/* This list holds all data associated with one session. */
typedef struct ps_sd {
struct ps_sd *next;
@ -67,9 +65,9 @@ typedef struct {
static ps_mm *ps_mm_instance = NULL;
#if 0
#define ps_mm_debug(a) printf a
# define ps_mm_debug(a) printf a
#else
#define ps_mm_debug(a)
# define ps_mm_debug(a)
#endif
static inline php_uint32 ps_sd_hash(const char *data, int len)
@ -146,9 +144,10 @@ static ps_sd *ps_sd_new(ps_mm *data, const char *key)
data->hash_cnt++;
if (!sd->next) {
if (data->hash_cnt >= data->hash_max)
if (data->hash_cnt >= data->hash_max) {
hash_split(data);
}
}
ps_mm_debug(("inserting %s(%p) into slot %d\n", key, sd, slot));
@ -161,9 +160,9 @@ static void ps_sd_destroy(ps_mm *data, ps_sd *sd)
slot = ps_sd_hash(sd->key, strlen(sd->key)) & data->hash_max;
if (data->hash[slot] == sd)
if (data->hash[slot] == sd) {
data->hash[slot] = sd->next;
else {
} else {
ps_sd *prev;
/* There must be some entry before the one we want to delete */
@ -172,8 +171,11 @@ static void ps_sd_destroy(ps_mm *data, ps_sd *sd)
}
data->hash_cnt--;
if (sd->data)
if (sd->data) {
mm_free(data->mm, sd->data);
}
mm_free(data->mm, sd);
}
@ -185,15 +187,18 @@ static ps_sd *ps_sd_lookup(ps_mm *data, const char *key, int rw)
hv = ps_sd_hash(key, strlen(key));
slot = hv & data->hash_max;
for (prev = NULL, ret = data->hash[slot]; ret; prev = ret, ret = ret->next)
if (ret->hv == hv && !strcmp(ret->key, key))
for (prev = NULL, ret = data->hash[slot]; ret; prev = ret, ret = ret->next) {
if (ret->hv == hv && !strcmp(ret->key, key)) {
break;
}
}
if (ret && rw && ret != data->hash[slot]) {
/* Move the entry to the top of the linked list */
if (prev)
if (prev) {
prev->next = ret->next;
}
ret->next = data->hash[slot];
data->hash[slot] = ret;
}
@ -236,13 +241,16 @@ static void ps_mm_destroy(ps_mm *data)
/* This function is called during each module shutdown,
but we must not release the shared memory pool, when
an Apache child dies! */
if (data->owner != getpid()) return;
if (data->owner != getpid()) {
return;
}
for (h = 0; h < data->hash_max + 1; h++)
for (h = 0; h < data->hash_max + 1; h++) {
for (sd = data->hash[h]; sd; sd = next) {
next = sd->next;
ps_sd_destroy(data, sd);
}
}
mm_free(data->mm, data->hash);
mm_destroy(data->mm);
@ -308,9 +316,9 @@ PS_OPEN_FUNC(mm)
{
ps_mm_debug(("open: ps_mm_instance=%p\n", ps_mm_instance));
if (!ps_mm_instance)
if (!ps_mm_instance) {
return FAILURE;
}
PS_SET_MOD_DATA(ps_mm_instance);
return SUCCESS;
@ -360,8 +368,9 @@ PS_WRITE_FUNC(mm)
if (sd) {
if (vallen >= sd->alloclen) {
if (data->mm)
if (data->mm) {
mm_free(data->mm, sd->data);
}
sd->alloclen = vallen + 1;
sd->data = mm_malloc(data->mm, sd->alloclen);
@ -391,8 +400,9 @@ PS_DESTROY_FUNC(mm)
mm_lock(data->mm, MM_LOCK_RW);
sd = ps_sd_lookup(data, key, 0);
if (sd)
if (sd) {
ps_sd_destroy(data, sd);
}
mm_unlock(data->mm);
@ -416,7 +426,7 @@ PS_GC_FUNC(mm)
mm_lock(data->mm, MM_LOCK_RW);
ehash = data->hash + data->hash_max + 1;
for (ohash = data->hash; ohash < ehash; ohash++)
for (ohash = data->hash; ohash < ehash; ohash++) {
for (sd = *ohash; sd; sd = next) {
next = sd->next;
if (sd->ctime < limit) {
@ -425,6 +435,7 @@ PS_GC_FUNC(mm)
(*nrdels)++;
}
}
}
mm_unlock(data->mm);

View file

@ -29,36 +29,28 @@ ps_module ps_mod_user = {
#define SESS_ZVAL_LONG(val, a) \
{ \
MAKE_STD_ZVAL(a); \
Z_TYPE_P(a) = IS_LONG; \
Z_LVAL_P(a) = val; \
ZVAL_LONG(a, val); \
}
#define SESS_ZVAL_STRING(vl, a) \
{ \
int len = strlen(vl); \
MAKE_STD_ZVAL(a); \
Z_TYPE_P(a) = IS_STRING; \
Z_STRLEN_P(a) = len; \
Z_STRVAL_P(a) = estrndup(vl, len); \
char *__vl = vl; \
SESS_ZVAL_STRINGN(__vl, strlen(__vl), a); \
}
#define SESS_ZVAL_STRINGN(vl, ln, a) \
{ \
MAKE_STD_ZVAL(a); \
Z_TYPE_P(a) = IS_STRING; \
Z_STRLEN_P(a) = ln; \
Z_STRVAL_P(a) = estrndup(vl, ln); \
ZVAL_STRINGL(a, vl, ln, 1); \
}
static zval *ps_call_handler(zval *func, int argc, zval **argv TSRMLS_DC)
{
int i;
zval *retval = NULL;
MAKE_STD_ZVAL(retval);
if (call_user_function(EG(function_table), NULL, func, retval,
argc, argv TSRMLS_CC) == FAILURE) {
if (call_user_function(EG(function_table), NULL, func, retval, argc, argv TSRMLS_CC) == FAILURE) {
zval_ptr_dtor(&retval);
retval = NULL;
}
@ -77,8 +69,7 @@ static zval *ps_call_handler(zval *func, int argc, zval **argv TSRMLS_DC)
#define STDVARS \
STDVARS1; \
char *mdata = PS_GET_MOD_DATA(); \
if (!mdata) \
return FAILURE
if (!mdata) { return FAILURE; }
#define PSF(a) PS(mod_user_names).name.ps_##a
@ -96,8 +87,8 @@ PS_OPEN_FUNC(user)
static char dummy = 0;
STDVARS1;
SESS_ZVAL_STRING(save_path, args[0]);
SESS_ZVAL_STRING(session_name, args[1]);
SESS_ZVAL_STRING((char*)save_path, args[0]);
SESS_ZVAL_STRING((char*)session_name, args[1]);
retval = ps_call_handler(PSF(open), 2, args TSRMLS_CC);
if (retval) {
@ -105,8 +96,7 @@ PS_OPEN_FUNC(user)
* use a static. Neither mod_user nor the session module itself will
* ever touch this pointer. It could be set to 0xDEADBEEF for all the
* difference it makes, but for the sake of paranoia it's set to some
* valid value.
*/
* valid value. */
PS_SET_MOD_DATA(&dummy);
}
@ -129,7 +119,7 @@ PS_READ_FUNC(user)
zval *args[1];
STDVARS;
SESS_ZVAL_STRING(key, args[0]);
SESS_ZVAL_STRING((char*)key, args[0]);
retval = ps_call_handler(PSF(read), 1, args TSRMLS_CC);
@ -150,8 +140,8 @@ PS_WRITE_FUNC(user)
zval *args[2];
STDVARS;
SESS_ZVAL_STRING(key, args[0]);
SESS_ZVAL_STRINGN(val, vallen, args[1]);
SESS_ZVAL_STRING((char*)key, args[0]);
SESS_ZVAL_STRINGN((char*)val, vallen, args[1]);
retval = ps_call_handler(PSF(write), 2, args TSRMLS_CC);
@ -163,7 +153,7 @@ PS_DESTROY_FUNC(user)
zval *args[1];
STDVARS;
SESS_ZVAL_STRING(key, args[0]);
SESS_ZVAL_STRING((char*)key, args[0]);
retval = ps_call_handler(PSF(destroy), 1, args TSRMLS_CC);

View file

@ -132,15 +132,12 @@ PHPAPI void php_add_session_var(char *name, size_t namelen TSRMLS_DC) /* {{{ */
zval **sym_track = NULL;
IF_SESSION_VARS() {
zend_hash_find(Z_ARRVAL_P(PS(http_session_vars)), name, namelen + 1,
(void *) &sym_track);
zend_hash_find(Z_ARRVAL_P(PS(http_session_vars)), name, namelen + 1, (void *) &sym_track);
} else {
return;
}
/*
* Set up a proper reference between $_SESSION["x"] and $x.
*/
/* Set up a proper reference between $_SESSION["x"] and $x. */
if (PG(register_globals)) {
zval **sym_global = NULL;
@ -185,8 +182,7 @@ PHPAPI void php_set_session_var(char *name, size_t namelen, zval *state_val, php
return;
}
/*
* A global symbol with the same name exists already. That
/* A global symbol with the same name exists already. That
* symbol might have been created by other means (e.g. $_GET).
*
* hash_update in zend_set_hash_symbol is not good, because
@ -194,16 +190,13 @@ PHPAPI void php_set_session_var(char *name, size_t namelen, zval *state_val, php
* of a global variable) dangling.
*
* BTW: if you use register_globals references between
* session-vars won't work because of this very reason!
*/
* 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
/* The following line will update the reference table used for
* unserialization. It is optional, because some storage
* formats may not be able to represent references.
*/
* formats may not be able to represent references. */
if (var_hash) {
PHP_VAR_UNSERIALIZE_ZVAL_CHANGED(var_hash,state_val,*old_symbol);
@ -224,23 +217,18 @@ PHPAPI int php_get_session_var(char *name, size_t namelen, zval ***state_var TSR
int ret = FAILURE;
IF_SESSION_VARS() {
ret = zend_hash_find(Z_ARRVAL_P(PS(http_session_vars)), name,
namelen+1, (void **) state_var);
ret = zend_hash_find(Z_ARRVAL_P(PS(http_session_vars)), name, namelen + 1, (void **) state_var);
/*
* If register_globals is enabled, and
/* If register_globals is enabled, and
* if there is an entry for the slot in $_SESSION, and
* if that entry is still set to NULL, and
* if the global var exists, then
* we prefer the same key in the global sym table
*/
* we prefer the same key in the global sym table. */
if (PG(register_globals) && ret == SUCCESS
&& Z_TYPE_PP(*state_var) == IS_NULL) {
if (PG(register_globals) && ret == SUCCESS && Z_TYPE_PP(*state_var) == IS_NULL) {
zval **tmp;
if (zend_hash_find(&EG(symbol_table), name, namelen + 1,
(void **) &tmp) == SUCCESS) {
if (zend_hash_find(&EG(symbol_table), name, namelen + 1, (void **) &tmp) == SUCCESS) {
*state_var = tmp;
}
}
@ -378,17 +366,15 @@ PHPAPI char *php_session_create_id(PS_CREATE_SID_ARGS) /* {{{ */
gettimeofday(&tv, NULL);
if (zend_hash_find(&EG(symbol_table), "_SERVER",
sizeof("_SERVER"), (void **) &array) == SUCCESS &&
if (zend_hash_find(&EG(symbol_table), "_SERVER", sizeof("_SERVER"), (void **) &array) == SUCCESS &&
Z_TYPE_PP(array) == IS_ARRAY &&
zend_hash_find(Z_ARRVAL_PP(array), "REMOTE_ADDR",
sizeof("REMOTE_ADDR"), (void **) &token) == SUCCESS) {
zend_hash_find(Z_ARRVAL_PP(array), "REMOTE_ADDR", sizeof("REMOTE_ADDR"), (void **) &token) == SUCCESS
) {
remote_addr = Z_STRVAL_PP(token);
}
/* 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);
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)) {
case PS_HASH_FUNC_MD5:
@ -527,8 +513,7 @@ new_session:
/* 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
* it could prove usefull for those sites which wish to have "default"
* session information
*/
* session information. */
php_session_track_init(TSRMLS_C);
PS(invalid_session_id) = 0;
if (PS(mod)->s_read(&PS(mod_data), PS(id), &val, &vallen TSRMLS_CC) == SUCCESS) {
@ -556,11 +541,10 @@ static int migrate_global(HashTable *ht, HashPosition *pos TSRMLS_DC) /* {{{ */
switch (n) {
case HASH_KEY_IS_STRING:
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,
Z_REFCOUNT_PP(val) + 1 , 1);
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, Z_REFCOUNT_PP(val) + 1, 1);
ret = 1;
}
break;
@ -587,12 +571,12 @@ static void php_session_save_current_state(TSRMLS_D) /* {{{ */
zend_hash_internal_pointer_reset_ex(ht, &pos);
while (zend_hash_get_current_data_ex(ht,
(void **) &val, &pos) != FAILURE) {
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))
if (migrate_global(ht, &pos TSRMLS_CC)) {
do_warn = 1;
}
}
zend_hash_move_forward_ex(ht, &pos);
}
@ -648,6 +632,8 @@ static PHP_INI_MH(OnUpdateSaveHandler) /* {{{ */
} else {
err_type = E_ERROR;
}
/* Do not output error when restoring ini options. */
if (stage != ZEND_INI_STAGE_DEACTIVATE) {
php_error_docref(NULL TSRMLS_CC, err_type, "Cannot find save handler '%s'", new_value);
}
@ -674,6 +660,8 @@ static PHP_INI_MH(OnUpdateSerializer) /* {{{ */
} else {
err_type = E_ERROR;
}
/* Do not output error when restoring ini options. */
if (stage != ZEND_INI_STAGE_DEACTIVATE) {
php_error_docref(NULL TSRMLS_CC, err_type, "Cannot find serialization handler '%s'", new_value);
}
@ -723,6 +711,7 @@ static PHP_INI_MH(OnUpdateSaveDir) /* {{{ */
return FAILURE;
}
}
OnUpdateString(entry, new_value, new_value_length, mh_arg1, mh_arg2, mh_arg3, stage TSRMLS_CC);
return SUCCESS;
}
@ -1002,10 +991,7 @@ static ps_serializer ps_serializers[MAX_SERIALIZERS + 1] = {
PS_SERIALIZER_ENTRY(php_binary)
};
PHPAPI int php_session_register_serializer(
const char *name,
int (*encode)(PS_SERIALIZER_ENCODE_ARGS),
int (*decode)(PS_SERIALIZER_DECODE_ARGS)) /* {{{ */
PHPAPI int php_session_register_serializer(const char *name, int (*encode)(PS_SERIALIZER_ENCODE_ARGS), int (*decode)(PS_SERIALIZER_DECODE_ARGS)) /* {{{ */
{
int ret = -1;
int i;
@ -1188,8 +1174,7 @@ static int php_session_cache_limiter(TSRMLS_D) /* {{{ */
int output_start_lineno = php_get_output_start_lineno(TSRMLS_C);
if (output_start_filename) {
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Cannot send session cache limiter - headers already sent (output started at %s:%d)",
output_start_filename, output_start_lineno);
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Cannot send session cache limiter - headers already sent (output started at %s:%d)", output_start_filename, output_start_lineno);
} else {
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Cannot send session cache limiter - headers already sent");
}
@ -1229,8 +1214,7 @@ static void php_session_send_cookie(TSRMLS_D) /* {{{ */
int output_start_lineno = php_get_output_start_lineno(TSRMLS_C);
if (output_start_filename) {
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Cannot send session cookie - headers already sent by (output started at %s:%d)",
output_start_filename, output_start_lineno);
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Cannot send session cookie - headers already sent by (output started at %s:%d)", output_start_filename, output_start_lineno);
} else {
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Cannot send session cookie - headers already sent");
}
@ -1400,17 +1384,14 @@ PHPAPI void php_session_start(TSRMLS_D) /* {{{ */
lensess = strlen(PS(session_name));
/*
* Cookies are preferred, because initially
* cookie and get variables will be available.
*/
/* Cookies are preferred, because initially
* cookie and get variables will be available. */
if (!PS(id)) {
if (PS(use_cookies) && zend_hash_find(&EG(symbol_table), "_COOKIE",
sizeof("_COOKIE"), (void **) &data) == SUCCESS &&
if (PS(use_cookies) && zend_hash_find(&EG(symbol_table), "_COOKIE", sizeof("_COOKIE"), (void **) &data) == SUCCESS &&
Z_TYPE_PP(data) == IS_ARRAY &&
zend_hash_find(Z_ARRVAL_PP(data), PS(session_name),
lensess + 1, (void **) &ppid) == SUCCESS) {
zend_hash_find(Z_ARRVAL_PP(data), PS(session_name), lensess + 1, (void **) &ppid) == SUCCESS
) {
PPID2SID;
PS(apply_trans_sid) = 0;
PS(send_cookie) = 0;
@ -1418,36 +1399,34 @@ PHPAPI void php_session_start(TSRMLS_D) /* {{{ */
}
if (!PS(use_only_cookies) && !PS(id) &&
zend_hash_find(&EG(symbol_table), "_GET",
sizeof("_GET"), (void **) &data) == SUCCESS &&
zend_hash_find(&EG(symbol_table), "_GET", sizeof("_GET"), (void **) &data) == SUCCESS &&
Z_TYPE_PP(data) == IS_ARRAY &&
zend_hash_find(Z_ARRVAL_PP(data), PS(session_name),
lensess + 1, (void **) &ppid) == SUCCESS) {
zend_hash_find(Z_ARRVAL_PP(data), PS(session_name), lensess + 1, (void **) &ppid) == SUCCESS
) {
PPID2SID;
PS(send_cookie) = 0;
}
if (!PS(use_only_cookies) && !PS(id) &&
zend_hash_find(&EG(symbol_table), "_POST",
sizeof("_POST"), (void **) &data) == SUCCESS &&
zend_hash_find(&EG(symbol_table), "_POST", sizeof("_POST"), (void **) &data) == SUCCESS &&
Z_TYPE_PP(data) == IS_ARRAY &&
zend_hash_find(Z_ARRVAL_PP(data), PS(session_name),
lensess + 1, (void **) &ppid) == SUCCESS) {
zend_hash_find(Z_ARRVAL_PP(data), PS(session_name), lensess + 1, (void **) &ppid) == SUCCESS
) {
PPID2SID;
PS(send_cookie) = 0;
}
}
/* check the REQUEST_URI symbol for a string of the form
'<session-name>=<session-id>' to allow URLs of the form
http://yoursite/<session-name>=<session-id>/script.php */
/* Check the REQUEST_URI symbol for a string of the form
* '<session-name>=<session-id>' to allow URLs of the form
* http://yoursite/<session-name>=<session-id>/script.php */
if (!PS(use_only_cookies) && !PS(id) && PG(http_globals)[TRACK_VARS_SERVER] &&
zend_hash_find(Z_ARRVAL_P(PG(http_globals)[TRACK_VARS_SERVER]), "REQUEST_URI",
sizeof("REQUEST_URI"), (void **) &data) == SUCCESS &&
zend_hash_find(Z_ARRVAL_P(PG(http_globals)[TRACK_VARS_SERVER]), "REQUEST_URI", sizeof("REQUEST_URI"), (void **) &data) == SUCCESS &&
Z_TYPE_PP(data) == IS_STRING &&
(p = strstr(Z_STRVAL_PP(data), PS(session_name))) &&
p[lensess] == '=') {
p[lensess] == '='
) {
char *q;
p += lensess + 1;
@ -1457,17 +1436,17 @@ PHPAPI void php_session_start(TSRMLS_D) /* {{{ */
}
}
/* check whether the current request was referred to by
an external site which invalidates the previously found id */
/* 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] &&
zend_hash_find(Z_ARRVAL_P(PG(http_globals)[TRACK_VARS_SERVER]), "HTTP_REFERER",
sizeof("HTTP_REFERER"), (void **) &data) == SUCCESS &&
zend_hash_find(Z_ARRVAL_P(PG(http_globals)[TRACK_VARS_SERVER]), "HTTP_REFERER", sizeof("HTTP_REFERER"), (void **) &data) == SUCCESS &&
Z_TYPE_PP(data) == IS_STRING &&
Z_STRLEN_PP(data) != 0 &&
strstr(Z_STRVAL_PP(data), PS(extern_referer_chk)) == NULL) {
strstr(Z_STRVAL_PP(data), PS(extern_referer_chk)) == NULL
) {
efree(PS(id));
PS(id) = NULL;
PS(send_cookie) = 1;
@ -1540,8 +1519,7 @@ static PHP_FUNCTION(session_set_cookie_params)
zend_bool secure = 0, httponly = 0;
if (!PS(use_cookies) ||
zend_parse_parameters(argc TSRMLS_CC, "Z|ssbb", &lifetime, &path, &path_len,
&domain, &domain_len, &secure, &httponly) == FAILURE) {
zend_parse_parameters(argc TSRMLS_CC, "Z|ssbb", &lifetime, &path, &path_len, &domain, &domain_len, &secure, &httponly) == FAILURE) {
return;
}
@ -1830,7 +1808,8 @@ static void php_register_var(zval** entry TSRMLS_DC)
convert_to_string_ex(entry);
if ((strcmp(Z_STRVAL_PP(entry), "HTTP_SESSION_VARS") != 0) &&
(strcmp(Z_STRVAL_PP(entry), "_SESSION") != 0)) {
(strcmp(Z_STRVAL_PP(entry), "_SESSION") != 0)
) {
PS_ADD_VARL(Z_STRVAL_PP(entry), Z_STRLEN_PP(entry));
}
}
@ -1923,9 +1902,8 @@ static PHP_FUNCTION(session_unset)
zend_hash_internal_pointer_reset_ex(ht, &pos);
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);
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);
}
}