mirror of
https://github.com/php/php-src.git
synced 2025-08-18 23:18:56 +02:00
- WS + sync with PHP_5_3 (thanks Ilia & Co.)
This commit is contained in:
parent
34907a2aaa
commit
1aee5ff9fc
5 changed files with 194 additions and 216 deletions
|
@ -218,8 +218,7 @@ static void ps_files_open(ps_files *data, const char *key TSRMLS_DC)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
} else {
|
} else {
|
||||||
php_error_docref(NULL TSRMLS_CC, E_WARNING, "open(%s, O_RDWR) failed: %s (%d)", buf,
|
php_error_docref(NULL TSRMLS_CC, E_WARNING, "open(%s, O_RDWR) failed: %s (%d)", buf, strerror(errno), errno);
|
||||||
strerror(errno), errno);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -415,10 +414,7 @@ PS_WRITE_FUNC(files)
|
||||||
return FAILURE;
|
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) {
|
if (vallen < (int)data->st_size) {
|
||||||
ftruncate(data->fd, 0);
|
ftruncate(data->fd, 0);
|
||||||
|
@ -457,8 +453,7 @@ PS_DESTROY_FUNC(files)
|
||||||
|
|
||||||
if (VCWD_UNLINK(buf) == -1) {
|
if (VCWD_UNLINK(buf) == -1) {
|
||||||
/* This is a little safety check for instances when we are dealing with a regenerated session
|
/* 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)) {
|
if (!VCWD_ACCESS(buf, F_OK)) {
|
||||||
return FAILURE;
|
return FAILURE;
|
||||||
}
|
}
|
||||||
|
|
|
@ -42,9 +42,7 @@
|
||||||
/* For php_uint32 */
|
/* For php_uint32 */
|
||||||
#include "ext/standard/basic_functions.h"
|
#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 {
|
typedef struct ps_sd {
|
||||||
struct ps_sd *next;
|
struct ps_sd *next;
|
||||||
|
@ -146,9 +144,10 @@ static ps_sd *ps_sd_new(ps_mm *data, const char *key)
|
||||||
data->hash_cnt++;
|
data->hash_cnt++;
|
||||||
|
|
||||||
if (!sd->next) {
|
if (!sd->next) {
|
||||||
if (data->hash_cnt >= data->hash_max)
|
if (data->hash_cnt >= data->hash_max) {
|
||||||
hash_split(data);
|
hash_split(data);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
ps_mm_debug(("inserting %s(%p) into slot %d\n", key, sd, slot));
|
ps_mm_debug(("inserting %s(%p) into slot %d\n", key, sd, slot));
|
||||||
|
|
||||||
|
@ -196,7 +195,6 @@ static ps_sd *ps_sd_lookup(ps_mm *data, const char *key, int rw)
|
||||||
|
|
||||||
if (ret && rw && ret != data->hash[slot]) {
|
if (ret && rw && ret != data->hash[slot]) {
|
||||||
/* Move the entry to the top of the linked list */
|
/* Move the entry to the top of the linked list */
|
||||||
|
|
||||||
if (prev) {
|
if (prev) {
|
||||||
prev->next = ret->next;
|
prev->next = ret->next;
|
||||||
}
|
}
|
||||||
|
@ -243,7 +241,9 @@ static void ps_mm_destroy(ps_mm *data)
|
||||||
/* This function is called during each module shutdown,
|
/* This function is called during each module shutdown,
|
||||||
but we must not release the shared memory pool, when
|
but we must not release the shared memory pool, when
|
||||||
an Apache child dies! */
|
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) {
|
for (sd = data->hash[h]; sd; sd = next) {
|
||||||
|
@ -261,6 +261,7 @@ PHP_MINIT_FUNCTION(ps_mm)
|
||||||
{
|
{
|
||||||
int save_path_len = strlen(PS(save_path));
|
int save_path_len = strlen(PS(save_path));
|
||||||
int mod_name_len = strlen(sapi_module.name);
|
int mod_name_len = strlen(sapi_module.name);
|
||||||
|
int euid_len;
|
||||||
char *ps_mm_path, euid[30];
|
char *ps_mm_path, euid[30];
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
|
@ -269,22 +270,24 @@ PHP_MINIT_FUNCTION(ps_mm)
|
||||||
return FAILURE;
|
return FAILURE;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!snprintf(euid, sizeof(euid), "%d", geteuid())) {
|
if (!(euid_len = slprintf(euid, sizeof(euid), "%d", geteuid()))) {
|
||||||
return FAILURE;
|
return FAILURE;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Directory + '/' + File + Module Name + Effective UID + \0 */
|
/* Directory + '/' + File + Module Name + Effective UID + \0 */
|
||||||
ps_mm_path = emalloc(save_path_len+1+sizeof(PS_MM_FILE)+mod_name_len+strlen(euid)+1);
|
ps_mm_path = emalloc(save_path_len + 1 + (sizeof(PS_MM_FILE) - 1) + mod_name_len + euid_len + 1);
|
||||||
|
|
||||||
memcpy(ps_mm_path, PS(save_path), save_path_len + 1);
|
memcpy(ps_mm_path, PS(save_path), save_path_len);
|
||||||
if (save_path_len > 0 && ps_mm_path[save_path_len - 1] != DEFAULT_SLASH) {
|
if (PS(save_path)[save_path_len - 1] != DEFAULT_SLASH) {
|
||||||
ps_mm_path[save_path_len] = DEFAULT_SLASH;
|
ps_mm_path[save_path_len] = DEFAULT_SLASH;
|
||||||
ps_mm_path[save_path_len+1] = '\0';
|
save_path_len++;
|
||||||
}
|
}
|
||||||
|
memcpy(ps_mm_path + save_path_len, PS_MM_FILE, sizeof(PS_MM_FILE) - 1);
|
||||||
strcat(ps_mm_path, PS_MM_FILE);
|
save_path_len += sizeof(PS_MM_FILE) - 1;
|
||||||
strcat(ps_mm_path, sapi_module.name);
|
memcpy(ps_mm_path + save_path_len, sapi_module.name, mod_name_len);
|
||||||
strcat(ps_mm_path, euid);
|
save_path_len += mod_name_len;
|
||||||
|
memcpy(ps_mm_path + save_path_len, euid, euid_len);
|
||||||
|
ps_mm_path[save_path_len + euid_len] = '\0';
|
||||||
|
|
||||||
ret = ps_mm_initialize(ps_mm_instance, ps_mm_path);
|
ret = ps_mm_initialize(ps_mm_instance, ps_mm_path);
|
||||||
|
|
||||||
|
@ -316,7 +319,6 @@ PS_OPEN_FUNC(mm)
|
||||||
if (!ps_mm_instance) {
|
if (!ps_mm_instance) {
|
||||||
return FAILURE;
|
return FAILURE;
|
||||||
}
|
}
|
||||||
|
|
||||||
PS_SET_MOD_DATA(ps_mm_instance);
|
PS_SET_MOD_DATA(ps_mm_instance);
|
||||||
|
|
||||||
return SUCCESS;
|
return SUCCESS;
|
||||||
|
|
|
@ -32,6 +32,11 @@ ps_module ps_mod_user = {
|
||||||
ZVAL_LONG(a, val); \
|
ZVAL_LONG(a, val); \
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define SESS_ZVAL_STRING(vl, a) \
|
||||||
|
{ \
|
||||||
|
char *__vl = vl; \
|
||||||
|
SESS_ZVAL_STRINGN(__vl, strlen(__vl), a); \
|
||||||
|
}
|
||||||
|
|
||||||
#define SESS_ZVAL_STRINGN(vl, ln, a) \
|
#define SESS_ZVAL_STRINGN(vl, ln, a) \
|
||||||
{ \
|
{ \
|
||||||
|
@ -39,21 +44,13 @@ ps_module ps_mod_user = {
|
||||||
ZVAL_UTF8_STRINGL(a, vl, ln, ZSTR_DUPLICATE); \
|
ZVAL_UTF8_STRINGL(a, vl, ln, ZSTR_DUPLICATE); \
|
||||||
}
|
}
|
||||||
|
|
||||||
#define SESS_ZVAL_STRING(vl, a) \
|
|
||||||
{ \
|
|
||||||
char *__vl = vl; \
|
|
||||||
SESS_ZVAL_STRINGN(__vl, strlen(__vl), a); \
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static zval *ps_call_handler(zval *func, int argc, zval **argv TSRMLS_DC)
|
static zval *ps_call_handler(zval *func, int argc, zval **argv TSRMLS_DC)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
zval *retval = NULL;
|
zval *retval = NULL;
|
||||||
|
|
||||||
MAKE_STD_ZVAL(retval);
|
MAKE_STD_ZVAL(retval);
|
||||||
if (call_user_function(EG(function_table), NULL, func, retval,
|
if (call_user_function(EG(function_table), NULL, func, retval, argc, argv TSRMLS_CC) == FAILURE) {
|
||||||
argc, argv TSRMLS_CC) == FAILURE) {
|
|
||||||
zval_ptr_dtor(&retval);
|
zval_ptr_dtor(&retval);
|
||||||
retval = NULL;
|
retval = NULL;
|
||||||
}
|
}
|
||||||
|
@ -99,8 +96,7 @@ PS_OPEN_FUNC(user)
|
||||||
* use a static. Neither mod_user nor the session module itself will
|
* 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
|
* 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
|
* difference it makes, but for the sake of paranoia it's set to some
|
||||||
* valid value.
|
* valid value. */
|
||||||
*/
|
|
||||||
PS_SET_MOD_DATA(&dummy);
|
PS_SET_MOD_DATA(&dummy);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -148,7 +144,6 @@ PS_READ_FUNC(user)
|
||||||
ret = SUCCESS;
|
ret = SUCCESS;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
zval_ptr_dtor(&retval);
|
zval_ptr_dtor(&retval);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -246,21 +246,26 @@ PHPAPI const ps_serializer *_php_find_ps_serializer(char *name TSRMLS_DC);
|
||||||
/* (Possibly) needed for BC (e.g. by external modules using the session registry) */
|
/* (Possibly) needed for BC (e.g. by external modules using the session registry) */
|
||||||
#define PS_ENCODE_LOOP(code) do { \
|
#define PS_ENCODE_LOOP(code) do { \
|
||||||
HashTable *_ht = Z_ARRVAL_P(PS(http_session_vars)); \
|
HashTable *_ht = Z_ARRVAL_P(PS(http_session_vars)); \
|
||||||
|
int key_type; \
|
||||||
\
|
\
|
||||||
for (zend_hash_internal_pointer_reset(_ht); \
|
for (zend_hash_internal_pointer_reset(_ht); \
|
||||||
zend_hash_get_current_key_ex(_ht, &key, &key_length, &num_key, 0, NULL) == HASH_KEY_IS_STRING; \
|
(key_type = zend_hash_get_current_key_ex(_ht, &key, &key_length, &num_key, 0, NULL)) != HASH_KEY_NON_EXISTANT; \
|
||||||
zend_hash_move_forward(_ht)) { \
|
zend_hash_move_forward(_ht)) { \
|
||||||
|
if (key_type == HASH_KEY_IS_LONG) { \
|
||||||
|
php_error_docref(NULL TSRMLS_CC, E_NOTICE, "Skipping numeric key %ld", num_key); \
|
||||||
|
continue; \
|
||||||
|
} \
|
||||||
key_length--; \
|
key_length--; \
|
||||||
if (php_get_session_var(key.s, key_length, &struc TSRMLS_CC) == SUCCESS) { \
|
if (php_get_session_var(key, key_length, &struc TSRMLS_CC) == SUCCESS) { \
|
||||||
code; \
|
code; \
|
||||||
} \
|
} \
|
||||||
} \
|
} \
|
||||||
} while(0)
|
} while(0)
|
||||||
|
|
||||||
#define PS_UENCODE_LOOP(code) do { \
|
#define PS_UENCODE_LOOP(code) do { \
|
||||||
int key_type; \
|
|
||||||
HashTable *_ht = Z_ARRVAL_P(PS(http_session_vars)); \
|
HashTable *_ht = Z_ARRVAL_P(PS(http_session_vars)); \
|
||||||
HashPosition _pos; \
|
HashPosition _pos; \
|
||||||
|
int key_type; \
|
||||||
\
|
\
|
||||||
for (zend_hash_internal_pointer_reset_ex(_ht, &_pos); \
|
for (zend_hash_internal_pointer_reset_ex(_ht, &_pos); \
|
||||||
(key_type = zend_hash_get_current_key_ex(_ht, &key, &key_length, &num_key, 0, &_pos)) != HASH_KEY_NON_EXISTANT; \
|
(key_type = zend_hash_get_current_key_ex(_ht, &key, &key_length, &num_key, 0, &_pos)) != HASH_KEY_NON_EXISTANT; \
|
||||||
|
|
|
@ -137,8 +137,7 @@ PHPAPI void php_add_session_var(char *name, size_t namelen TSRMLS_DC) /* {{{ */
|
||||||
zval **sym_track = NULL;
|
zval **sym_track = NULL;
|
||||||
|
|
||||||
IF_SESSION_VARS() {
|
IF_SESSION_VARS() {
|
||||||
zend_rt_hash_find(Z_ARRVAL_P(PS(http_session_vars)), name, namelen + 1,
|
zend_rt_hash_find(Z_ARRVAL_P(PS(http_session_vars)), name, namelen + 1, (void *) &sym_track);
|
||||||
(void *) &sym_track);
|
|
||||||
} else {
|
} else {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -165,8 +164,7 @@ PHPAPI int php_get_session_var(char *name, size_t namelen, zval ***state_var TSR
|
||||||
int ret = FAILURE;
|
int ret = FAILURE;
|
||||||
|
|
||||||
IF_SESSION_VARS() {
|
IF_SESSION_VARS() {
|
||||||
ret = zend_rt_hash_find(Z_ARRVAL_P(PS(http_session_vars)), name,
|
ret = zend_rt_hash_find(Z_ARRVAL_P(PS(http_session_vars)), name, namelen + 1, (void **) state_var);
|
||||||
namelen+1, (void **) state_var);
|
|
||||||
}
|
}
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
@ -294,17 +292,15 @@ PHPAPI char *php_session_create_id(PS_CREATE_SID_ARGS) /* {{{ */
|
||||||
|
|
||||||
gettimeofday(&tv, NULL);
|
gettimeofday(&tv, NULL);
|
||||||
|
|
||||||
if (zend_ascii_hash_find(&EG(symbol_table), "_SERVER",
|
if (zend_ascii_hash_find(&EG(symbol_table), "_SERVER", sizeof("_SERVER"), (void **) &array) == SUCCESS &&
|
||||||
sizeof("_SERVER"), (void **) &array) == SUCCESS &&
|
|
||||||
Z_TYPE_PP(array) == IS_ARRAY &&
|
Z_TYPE_PP(array) == IS_ARRAY &&
|
||||||
zend_ascii_hash_find(Z_ARRVAL_PP(array), "REMOTE_ADDR",
|
zend_ascii_hash_find(Z_ARRVAL_PP(array), "REMOTE_ADDR", sizeof("REMOTE_ADDR"), (void **) &token) == SUCCESS
|
||||||
sizeof("REMOTE_ADDR"), (void **) &token) == SUCCESS) {
|
) {
|
||||||
remote_addr = Z_STRVAL_PP(token);
|
remote_addr = Z_STRVAL_PP(token);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* maximum 15+19+19+10 bytes */
|
/* maximum 15+19+19+10 bytes */
|
||||||
spprintf(&buf, 0, "%.15s%ld%ld%0.8F", remote_addr ? remote_addr : "",
|
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);
|
||||||
tv.tv_sec, (long int)tv.tv_usec, php_combined_lcg(TSRMLS_C) * 10);
|
|
||||||
|
|
||||||
switch (PS(hash_func)) {
|
switch (PS(hash_func)) {
|
||||||
case PS_HASH_FUNC_MD5:
|
case PS_HASH_FUNC_MD5:
|
||||||
|
@ -443,8 +439,7 @@ new_session:
|
||||||
/* Question: if you create a SID here, should you also try to 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
|
* 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"
|
* it could prove usefull for those sites which wish to have "default"
|
||||||
* session information
|
* session information. */
|
||||||
*/
|
|
||||||
php_session_track_init(TSRMLS_C);
|
php_session_track_init(TSRMLS_C);
|
||||||
PS(invalid_session_id) = 0;
|
PS(invalid_session_id) = 0;
|
||||||
if (PS(mod)->s_read(&PS(mod_data), PS(id), &val, &vallen TSRMLS_CC) == SUCCESS) {
|
if (PS(mod)->s_read(&PS(mod_data), PS(id), &val, &vallen TSRMLS_CC) == SUCCESS) {
|
||||||
|
@ -689,15 +684,11 @@ PHP_INI_BEGIN()
|
||||||
STD_PHP_INI_ENTRY("session.hash_bits_per_character", "4", PHP_INI_ALL, OnUpdateLong, hash_bits_per_character, php_ps_globals, ps_globals)
|
STD_PHP_INI_ENTRY("session.hash_bits_per_character", "4", PHP_INI_ALL, OnUpdateLong, hash_bits_per_character, php_ps_globals, ps_globals)
|
||||||
|
|
||||||
/* Upload progress */
|
/* Upload progress */
|
||||||
STD_PHP_INI_BOOLEAN("session.upload_progress.enabled",
|
STD_PHP_INI_BOOLEAN("session.upload_progress.enabled", "1", ZEND_INI_PERDIR, OnUpdateBool, rfc1867_enabled, php_ps_globals, ps_globals)
|
||||||
"1", ZEND_INI_PERDIR, OnUpdateBool, rfc1867_enabled, php_ps_globals, ps_globals)
|
STD_PHP_INI_ENTRY("session.upload_progress.prefix", "upload_progress_", ZEND_INI_PERDIR, OnUpdateUTF8String, rfc1867_prefix, php_ps_globals, ps_globals)
|
||||||
STD_PHP_INI_ENTRY("session.upload_progress.prefix",
|
STD_PHP_INI_ENTRY("session.upload_progress.name", "PHP_SESSION_UPLOAD_PROGRESS", ZEND_INI_PERDIR, OnUpdateUTF8String, rfc1867_name, php_ps_globals, ps_globals)
|
||||||
"upload_progress_", ZEND_INI_PERDIR, OnUpdateUTF8String, rfc1867_prefix, php_ps_globals, ps_globals)
|
|
||||||
STD_PHP_INI_ENTRY("session.upload_progress.name",
|
|
||||||
"PHP_SESSION_UPLOAD_PROGRESS", ZEND_INI_PERDIR, OnUpdateUTF8String, rfc1867_name, php_ps_globals, ps_globals)
|
|
||||||
STD_PHP_INI_ENTRY("session.upload_progress.freq", "1%", ZEND_INI_PERDIR, OnUpdateRfc1867Freq, rfc1867_freq, php_ps_globals, ps_globals)
|
STD_PHP_INI_ENTRY("session.upload_progress.freq", "1%", ZEND_INI_PERDIR, OnUpdateRfc1867Freq, rfc1867_freq, php_ps_globals, ps_globals)
|
||||||
STD_PHP_INI_ENTRY("session.upload_progress.min_freq",
|
STD_PHP_INI_ENTRY("session.upload_progress.min_freq", "0", ZEND_INI_PERDIR, OnUpdateReal, rfc1867_min_freq,php_ps_globals, ps_globals)
|
||||||
"0", ZEND_INI_PERDIR, OnUpdateReal, rfc1867_min_freq,php_ps_globals, ps_globals)
|
|
||||||
|
|
||||||
/* Commented out until future discussion */
|
/* Commented out until future discussion */
|
||||||
/* PHP_INI_ENTRY("session.encode_sources", "globals,track", PHP_INI_ALL, NULL) */
|
/* PHP_INI_ENTRY("session.encode_sources", "globals,track", PHP_INI_ALL, NULL) */
|
||||||
|
@ -920,10 +911,7 @@ static ps_serializer ps_serializers[MAX_SERIALIZERS + 1] = {
|
||||||
PS_SERIALIZER_ENTRY(php_binary)
|
PS_SERIALIZER_ENTRY(php_binary)
|
||||||
};
|
};
|
||||||
|
|
||||||
PHPAPI int php_session_register_serializer(
|
PHPAPI int php_session_register_serializer(const char *name, int (*encode)(PS_SERIALIZER_ENCODE_ARGS), int (*decode)(PS_SERIALIZER_DECODE_ARGS)) /* {{{ */
|
||||||
const char *name,
|
|
||||||
int (*encode)(PS_SERIALIZER_ENCODE_ARGS),
|
|
||||||
int (*decode)(PS_SERIALIZER_DECODE_ARGS)) /* {{{ */
|
|
||||||
{
|
{
|
||||||
int ret = -1;
|
int ret = -1;
|
||||||
int i;
|
int i;
|
||||||
|
@ -1106,8 +1094,7 @@ static int php_session_cache_limiter(TSRMLS_D) /* {{{ */
|
||||||
int output_start_lineno = php_output_get_start_lineno(TSRMLS_C);
|
int output_start_lineno = php_output_get_start_lineno(TSRMLS_C);
|
||||||
|
|
||||||
if (output_start_filename) {
|
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)",
|
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);
|
||||||
output_start_filename, output_start_lineno);
|
|
||||||
} else {
|
} else {
|
||||||
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Cannot send session cache limiter - headers already sent");
|
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Cannot send session cache limiter - headers already sent");
|
||||||
}
|
}
|
||||||
|
@ -1147,8 +1134,7 @@ static void php_session_send_cookie(TSRMLS_D) /* {{{ */
|
||||||
int output_start_lineno = php_output_get_start_lineno(TSRMLS_C);
|
int output_start_lineno = php_output_get_start_lineno(TSRMLS_C);
|
||||||
|
|
||||||
if (output_start_filename) {
|
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)",
|
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);
|
||||||
output_start_filename, output_start_lineno);
|
|
||||||
} else {
|
} else {
|
||||||
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Cannot send session cookie - headers already sent");
|
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Cannot send session cookie - headers already sent");
|
||||||
}
|
}
|
||||||
|
@ -1318,17 +1304,14 @@ PHPAPI void php_session_start(TSRMLS_D) /* {{{ */
|
||||||
|
|
||||||
lensess = strlen(PS(session_name));
|
lensess = strlen(PS(session_name));
|
||||||
|
|
||||||
/*
|
/* Cookies are preferred, because initially
|
||||||
* Cookies are preferred, because initially
|
* cookie and get variables will be available. */
|
||||||
* cookie and get variables will be available.
|
|
||||||
*/
|
|
||||||
|
|
||||||
if (!PS(id)) {
|
if (!PS(id)) {
|
||||||
if (PS(use_cookies) && zend_ascii_hash_find(&EG(symbol_table), "_COOKIE",
|
if (PS(use_cookies) && zend_ascii_hash_find(&EG(symbol_table), "_COOKIE", sizeof("_COOKIE"), (void **) &data) == SUCCESS &&
|
||||||
sizeof("_COOKIE"), (void **) &data) == SUCCESS &&
|
|
||||||
Z_TYPE_PP(data) == IS_ARRAY &&
|
Z_TYPE_PP(data) == IS_ARRAY &&
|
||||||
zend_ascii_hash_find(Z_ARRVAL_PP(data), PS(session_name),
|
zend_ascii_hash_find(Z_ARRVAL_PP(data), PS(session_name), lensess + 1, (void **) &ppid) == SUCCESS
|
||||||
lensess + 1, (void **) &ppid) == SUCCESS) {
|
) {
|
||||||
PPID2SID;
|
PPID2SID;
|
||||||
PS(apply_trans_sid) = 0;
|
PS(apply_trans_sid) = 0;
|
||||||
PS(send_cookie) = 0;
|
PS(send_cookie) = 0;
|
||||||
|
@ -1336,36 +1319,34 @@ PHPAPI void php_session_start(TSRMLS_D) /* {{{ */
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!PS(use_only_cookies) && !PS(id) &&
|
if (!PS(use_only_cookies) && !PS(id) &&
|
||||||
zend_ascii_hash_find(&EG(symbol_table), "_GET",
|
zend_ascii_hash_find(&EG(symbol_table), "_GET", sizeof("_GET"), (void **) &data) == SUCCESS &&
|
||||||
sizeof("_GET"), (void **) &data) == SUCCESS &&
|
|
||||||
Z_TYPE_PP(data) == IS_ARRAY &&
|
Z_TYPE_PP(data) == IS_ARRAY &&
|
||||||
zend_rt_hash_find(Z_ARRVAL_PP(data), PS(session_name),
|
zend_rt_hash_find(Z_ARRVAL_PP(data), PS(session_name), lensess + 1, (void **) &ppid) == SUCCESS
|
||||||
lensess + 1, (void **) &ppid) == SUCCESS) {
|
) {
|
||||||
PPID2SID;
|
PPID2SID;
|
||||||
PS(send_cookie) = 0;
|
PS(send_cookie) = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!PS(use_only_cookies) && !PS(id) &&
|
if (!PS(use_only_cookies) && !PS(id) &&
|
||||||
zend_ascii_hash_find(&EG(symbol_table), "_POST",
|
zend_ascii_hash_find(&EG(symbol_table), "_POST", sizeof("_POST"), (void **) &data) == SUCCESS &&
|
||||||
sizeof("_POST"), (void **) &data) == SUCCESS &&
|
|
||||||
Z_TYPE_PP(data) == IS_ARRAY &&
|
Z_TYPE_PP(data) == IS_ARRAY &&
|
||||||
zend_rt_hash_find(Z_ARRVAL_PP(data), PS(session_name),
|
zend_rt_hash_find(Z_ARRVAL_PP(data), PS(session_name), lensess + 1, (void **) &ppid) == SUCCESS
|
||||||
lensess + 1, (void **) &ppid) == SUCCESS) {
|
) {
|
||||||
PPID2SID;
|
PPID2SID;
|
||||||
PS(send_cookie) = 0;
|
PS(send_cookie) = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* check the REQUEST_URI symbol for a string of the form
|
/* Check the REQUEST_URI symbol for a string of the form
|
||||||
'<session-name>=<session-id>' to allow URLs of the form
|
* '<session-name>=<session-id>' to allow URLs of the form
|
||||||
http://yoursite/<session-name>=<session-id>/script.php */
|
* http://yoursite/<session-name>=<session-id>/script.php */
|
||||||
|
|
||||||
if (!PS(use_only_cookies) && !PS(id) && PG(http_globals)[TRACK_VARS_SERVER] &&
|
if (!PS(use_only_cookies) && !PS(id) && PG(http_globals)[TRACK_VARS_SERVER] &&
|
||||||
zend_ascii_hash_find(Z_ARRVAL_P(PG(http_globals)[TRACK_VARS_SERVER]), "REQUEST_URI",
|
zend_ascii_hash_find(Z_ARRVAL_P(PG(http_globals)[TRACK_VARS_SERVER]), "REQUEST_URI", sizeof("REQUEST_URI"), (void **) &data) == SUCCESS &&
|
||||||
sizeof("REQUEST_URI"), (void **) &data) == SUCCESS &&
|
|
||||||
Z_TYPE_PP(data) == IS_STRING &&
|
Z_TYPE_PP(data) == IS_STRING &&
|
||||||
(p = strstr(Z_STRVAL_PP(data), PS(session_name))) &&
|
(p = strstr(Z_STRVAL_PP(data), PS(session_name))) &&
|
||||||
p[lensess] == '=') {
|
p[lensess] == '='
|
||||||
|
) {
|
||||||
char *q;
|
char *q;
|
||||||
|
|
||||||
p += lensess + 1;
|
p += lensess + 1;
|
||||||
|
@ -1375,17 +1356,17 @@ PHPAPI void php_session_start(TSRMLS_D) /* {{{ */
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* check whether the current request was referred to by
|
/* Check whether the current request was referred to by
|
||||||
an external site which invalidates the previously found id */
|
* an external site which invalidates the previously found id. */
|
||||||
|
|
||||||
if (PS(id) &&
|
if (PS(id) &&
|
||||||
PS(extern_referer_chk)[0] != '\0' &&
|
PS(extern_referer_chk)[0] != '\0' &&
|
||||||
PG(http_globals)[TRACK_VARS_SERVER] &&
|
PG(http_globals)[TRACK_VARS_SERVER] &&
|
||||||
zend_hash_find(Z_ARRVAL_P(PG(http_globals)[TRACK_VARS_SERVER]), "HTTP_REFERER",
|
zend_hash_find(Z_ARRVAL_P(PG(http_globals)[TRACK_VARS_SERVER]), "HTTP_REFERER", sizeof("HTTP_REFERER"), (void **) &data) == SUCCESS &&
|
||||||
sizeof("HTTP_REFERER"), (void **) &data) == SUCCESS &&
|
|
||||||
Z_TYPE_PP(data) == IS_STRING &&
|
Z_TYPE_PP(data) == IS_STRING &&
|
||||||
Z_STRLEN_PP(data) != 0 &&
|
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));
|
efree(PS(id));
|
||||||
PS(id) = NULL;
|
PS(id) = NULL;
|
||||||
PS(send_cookie) = 1;
|
PS(send_cookie) = 1;
|
||||||
|
@ -1452,18 +1433,19 @@ PHPAPI void session_adapt_url(const char *url, size_t urllen, char **new, size_t
|
||||||
Set session cookie parameters */
|
Set session cookie parameters */
|
||||||
static PHP_FUNCTION(session_set_cookie_params)
|
static PHP_FUNCTION(session_set_cookie_params)
|
||||||
{
|
{
|
||||||
/* lifetime is really a numeric, but the alter_ini_entry method wants a string */
|
zval **lifetime = NULL;
|
||||||
char *lifetime, *path = NULL, *domain = NULL;
|
char *path = NULL, *domain = NULL;
|
||||||
int lifetime_len, path_len, domain_len, argc = ZEND_NUM_ARGS();
|
int path_len, domain_len, argc = ZEND_NUM_ARGS();
|
||||||
zend_bool secure = 0, httponly = 0;
|
zend_bool secure = 0, httponly = 0;
|
||||||
|
|
||||||
if (!PS(use_cookies) ||
|
if (!PS(use_cookies) ||
|
||||||
zend_parse_parameters(argc TSRMLS_CC, "s|ssbb", &lifetime, &lifetime_len, &path, &path_len,
|
zend_parse_parameters(argc TSRMLS_CC, "Z|ssbb", &lifetime, &path, &path_len, &domain, &domain_len, &secure, &httponly) == FAILURE) {
|
||||||
&domain, &domain_len, &secure, &httponly) == FAILURE) {
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
zend_alter_ini_entry("session.cookie_lifetime", sizeof("session.cookie_lifetime"), lifetime, lifetime_len, PHP_INI_USER, PHP_INI_STAGE_RUNTIME);
|
convert_to_string_ex(lifetime);
|
||||||
|
|
||||||
|
zend_alter_ini_entry("session.cookie_lifetime", sizeof("session.cookie_lifetime"), Z_STRVAL_PP(lifetime), Z_STRLEN_PP(lifetime), PHP_INI_USER, PHP_INI_STAGE_RUNTIME);
|
||||||
|
|
||||||
if (path) {
|
if (path) {
|
||||||
zend_alter_ini_entry("session.cookie_path", sizeof("session.cookie_path"), path, path_len, PHP_INI_USER, PHP_INI_STAGE_RUNTIME);
|
zend_alter_ini_entry("session.cookie_path", sizeof("session.cookie_path"), path, path_len, PHP_INI_USER, PHP_INI_STAGE_RUNTIME);
|
||||||
|
@ -1730,18 +1712,18 @@ static PHP_FUNCTION(session_cache_limiter)
|
||||||
Return the current cache expire. If new_cache_expire is given, the current cache_expire is replaced with new_cache_expire */
|
Return the current cache expire. If new_cache_expire is given, the current cache_expire is replaced with new_cache_expire */
|
||||||
static PHP_FUNCTION(session_cache_expire)
|
static PHP_FUNCTION(session_cache_expire)
|
||||||
{
|
{
|
||||||
/* Expires is really a numeric, but the alter_ini_entry method wants a string */
|
zval **expires = NULL;
|
||||||
char *expires = NULL;
|
int argc = ZEND_NUM_ARGS();
|
||||||
int expires_len;
|
|
||||||
|
|
||||||
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|s&", &expires, &expires_len, UG(utf8_conv)) == FAILURE) {
|
if (zend_parse_parameters(argc TSRMLS_CC, "|Z", &expires) == FAILURE) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
RETVAL_LONG(PS(cache_expire));
|
RETVAL_LONG(PS(cache_expire));
|
||||||
|
|
||||||
if (expires) {
|
if (argc == 1) {
|
||||||
zend_alter_ini_entry("session.cache_expire", sizeof("session.cache_expire"), expires, expires_len, ZEND_INI_USER, ZEND_INI_STAGE_RUNTIME);
|
convert_to_string_ex(expires);
|
||||||
|
zend_alter_ini_entry("session.cache_expire", sizeof("session.cache_expire"), Z_STRVAL_PP(expires), Z_STRLEN_PP(expires), ZEND_INI_USER, ZEND_INI_STAGE_RUNTIME);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/* }}} */
|
/* }}} */
|
||||||
|
@ -2115,9 +2097,9 @@ static inline void php_session_rfc1867_early_find_sid(php_session_rfc1867_progre
|
||||||
|
|
||||||
if (PS(use_cookies)) {
|
if (PS(use_cookies)) {
|
||||||
sapi_module.treat_data(PARSE_COOKIE, NULL, NULL TSRMLS_CC);
|
sapi_module.treat_data(PARSE_COOKIE, NULL, NULL TSRMLS_CC);
|
||||||
if (PG(http_globals)[TRACK_VARS_COOKIE]
|
if (PG(http_globals)[TRACK_VARS_COOKIE] &&
|
||||||
&& zend_u_hash_find(Z_ARRVAL_P(PG(http_globals)[TRACK_VARS_COOKIE]), Z_TYPE(progress->sname), Z_UNIVAL(progress->sname), Z_UNILEN(progress->sname)+1, (void **)&ppid) == SUCCESS) {
|
zend_u_hash_find(Z_ARRVAL_P(PG(http_globals)[TRACK_VARS_COOKIE]), Z_TYPE(progress->sname), Z_UNIVAL(progress->sname), Z_UNILEN(progress->sname)+1, (void **)&ppid) == SUCCESS
|
||||||
|
) {
|
||||||
zval_dtor(&progress->sid);
|
zval_dtor(&progress->sid);
|
||||||
ZVAL_ZVAL(&progress->sid, *ppid, 1, 0);
|
ZVAL_ZVAL(&progress->sid, *ppid, 1, 0);
|
||||||
convert_to_string(&progress->sid);
|
convert_to_string(&progress->sid);
|
||||||
|
@ -2129,9 +2111,9 @@ static inline void php_session_rfc1867_early_find_sid(php_session_rfc1867_progre
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
sapi_module.treat_data(PARSE_GET, NULL, NULL TSRMLS_CC);
|
sapi_module.treat_data(PARSE_GET, NULL, NULL TSRMLS_CC);
|
||||||
if (PG(http_globals)[TRACK_VARS_GET]
|
if (PG(http_globals)[TRACK_VARS_GET] &&
|
||||||
&& zend_u_hash_find(Z_ARRVAL_P(PG(http_globals)[TRACK_VARS_GET]), Z_TYPE(progress->sname), Z_UNIVAL(progress->sname), Z_UNILEN(progress->sname)+1, (void **)&ppid) == SUCCESS) {
|
zend_u_hash_find(Z_ARRVAL_P(PG(http_globals)[TRACK_VARS_GET]), Z_TYPE(progress->sname), Z_UNIVAL(progress->sname), Z_UNILEN(progress->sname)+1, (void **)&ppid) == SUCCESS
|
||||||
|
) {
|
||||||
zval_dtor(&progress->sid);
|
zval_dtor(&progress->sid);
|
||||||
ZVAL_ZVAL(&progress->sid, *ppid, 1, 0);
|
ZVAL_ZVAL(&progress->sid, *ppid, 1, 0);
|
||||||
convert_to_string(&progress->sid);
|
convert_to_string(&progress->sid);
|
||||||
|
@ -2261,7 +2243,6 @@ static int php_session_rfc1867_callback(unsigned int event, void *event_data, vo
|
||||||
|
|
||||||
/* First FILE_START event, initializing */
|
/* First FILE_START event, initializing */
|
||||||
if (!progress->data) {
|
if (!progress->data) {
|
||||||
|
|
||||||
php_rinit_session(0 TSRMLS_CC);
|
php_rinit_session(0 TSRMLS_CC);
|
||||||
PS(id) = estrndup(Z_STRVAL(progress->sid), Z_STRLEN(progress->sid));
|
PS(id) = estrndup(Z_STRVAL(progress->sid), Z_STRLEN(progress->sid));
|
||||||
PS(apply_trans_sid) = progress->apply_trans_sid;
|
PS(apply_trans_sid) = progress->apply_trans_sid;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue