- WS + sync with PHP_5_3 (thanks Ilia & Co.)

This commit is contained in:
Jani Taskinen 2009-05-18 16:09:51 +00:00
parent 34907a2aaa
commit 1aee5ff9fc
5 changed files with 194 additions and 216 deletions

View file

@ -147,7 +147,7 @@ static char *ps_files_path_create(char *buf, size_t buflen, ps_files *data, cons
} }
#ifndef O_BINARY #ifndef O_BINARY
#define O_BINARY 0 # define O_BINARY 0
#endif #endif
static void ps_files_close(ps_files *data) static void ps_files_close(ps_files *data)
@ -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;
} }

View file

@ -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;
@ -67,9 +65,9 @@ typedef struct {
static ps_mm *ps_mm_instance = NULL; static ps_mm *ps_mm_instance = NULL;
#if 0 #if 0
#define ps_mm_debug(a) printf a # define ps_mm_debug(a) printf a
#else #else
#define ps_mm_debug(a) # define ps_mm_debug(a)
#endif #endif
static inline php_uint32 ps_sd_hash(const char *data, int len) 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++; 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;

View file

@ -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);
} }

View file

@ -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; \
@ -269,7 +274,7 @@ PHPAPI const ps_serializer *_php_find_ps_serializer(char *name TSRMLS_DC);
key_length--; \ key_length--; \
struc = NULL; \ struc = NULL; \
zend_hash_get_current_data_ex(_ht, (void**)&struc, &_pos); \ zend_hash_get_current_data_ex(_ht, (void**)&struc, &_pos); \
\ \
code; \ code; \
} \ } \
} while(0) } while(0)

View file

@ -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;