return FAILURE; \
}
-static void php_session_send_cookie(TSRMLS_D);
-static void php_session_abort(TSRMLS_D);
+#define APPLY_TRANS_SID (PS(use_trans_sid) && !PS(use_only_cookies))
+
+static void php_session_send_cookie(void);
++static void php_session_abort(void);
/* Dispatched by RINIT and by php_session_destroy */
-static inline void php_rinit_session_globals(TSRMLS_D) /* {{{ */
+static inline void php_rinit_session_globals(void) /* {{{ */
{
+ /* Do NOT init PS(mod_user_names) here! */
PS(id) = NULL;
PS(session_status) = php_session_none;
PS(mod_data) = NULL;
} /* }}} */
-static void php_session_initialize(TSRMLS_D) /* {{{ */
+static void php_session_initialize(void) /* {{{ */
{
- char *val = NULL;
- int vallen;
+ zend_string *val = NULL;
+ PS(session_status) = php_session_active;
+
if (!PS(mod)) {
- php_error_docref(NULL TSRMLS_CC, E_ERROR, "No storage module chosen - failed to initialize session");
+ PS(session_status) = php_session_disabled;
+ php_error_docref(NULL, E_ERROR, "No storage module chosen - failed to initialize session");
return;
}
/* Open session handler first */
- if (PS(mod)->s_open(&PS(mod_data), PS(save_path), PS(session_name) TSRMLS_CC) == FAILURE) {
- php_session_abort(TSRMLS_C);
- php_error_docref(NULL TSRMLS_CC, E_ERROR, "Failed to initialize storage module: %s (path: %s)", PS(mod)->s_name, PS(save_path));
+ if (PS(mod)->s_open(&PS(mod_data), PS(save_path), PS(session_name)) == FAILURE
+ /* || PS(mod_data) == NULL */ /* FIXME: open must set valid PS(mod_data) with success */
+ ) {
++ php_session_abort();
+ php_error_docref(NULL, 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)) {
- PS(id) = PS(mod)->s_create_sid(&PS(mod_data), NULL TSRMLS_CC);
+ PS(id) = PS(mod)->s_create_sid(&PS(mod_data));
if (!PS(id)) {
- php_session_abort(TSRMLS_C);
- php_error_docref(NULL TSRMLS_CC, E_ERROR, "Failed to create session ID: %s (path: %s)", PS(mod)->s_name, PS(save_path));
++ php_session_abort();
+ php_error_docref(NULL, E_ERROR, "Failed to create session ID: %s (path: %s)", PS(mod)->s_name, PS(save_path));
return;
}
if (PS(use_cookies)) {
PS(send_cookie) = 1;
}
+ } else if (PS(use_strict_mode) && PS(mod)->s_validate_sid &&
+ PS(mod)->s_validate_sid(&PS(mod_data), PS(id)) == FAILURE) {
+ if (PS(id)) {
+ zend_string_release(PS(id));
+ }
+ PS(id) = PS(mod)->s_create_sid(&PS(mod_data));
+ if (!PS(id)) {
+ PS(id) = php_session_create_id(NULL);
+ }
+ if (PS(use_cookies)) {
+ PS(send_cookie) = 1;
+ }
}
- /* Set session ID for compatibility for older/3rd party save handlers */
- if (!PS(use_strict_mode)) {
- php_session_reset_id(TSRMLS_C);
- }
+ php_session_reset_id();
- PS(session_status) = php_session_active;
/* GC must be done before read */
- php_session_gc(TSRMLS_C);
+ php_session_gc();
/* Read data */
- php_session_track_init(TSRMLS_C);
- if (PS(mod)->s_read(&PS(mod_data), PS(id), &val, &vallen TSRMLS_CC) == FAILURE) {
- /* php_session_abort(TSRMLS_C); */
+ php_session_track_init();
+ if (PS(mod)->s_read(&PS(mod_data), PS(id), &val, PS(gc_maxlifetime)) == FAILURE) {
++ php_session_abort();
/* Some broken save handler implementation returns FAILURE for non-existent session ID */
/* It's better to raise error for this, but disabled error for better compatibility */
- /*
- php_error_docref(NULL, E_NOTICE, "Failed to read session data: %s (path: %s)", PS(mod)->s_name, PS(save_path));
- */
- /* php_error_docref(NULL TSRMLS_CC, E_WARNING, "Failed to read session data: %s (path: %s)", PS(mod)->s_name, PS(save_path)); */
- /* return; */
++ php_error_docref(NULL, E_WARNING, "Failed to read session data: %s (path: %s)", PS(mod)->s_name, PS(save_path));
++ return;
}
- /* Set session ID if session read didn't activated session */
- if (PS(use_strict_mode) && PS(session_status) == php_session_none) {
- php_session_reset_id(TSRMLS_C);
- PS(session_status) = php_session_active;
+ if (PS(session_vars)) {
+ zend_string_release(PS(session_vars));
+ PS(session_vars) = NULL;
}
if (val) {
- php_session_decode(val, vallen TSRMLS_CC);
- str_efree(val);
- }
-
- if (!PS(use_cookies) && PS(send_cookie)) {
- if (PS(use_trans_sid) && !PS(use_only_cookies)) {
- PS(apply_trans_sid) = 1;
+ if (PS(lazy_write)) {
+ PS(session_vars) = zend_string_copy(val);
}
- PS(send_cookie) = 0;
+ php_session_decode(val);
+ zend_string_release(val);
}
}
/* }}} */
php_session_cache_limiter_t *lim;
if (PS(cache_limiter)[0] == '\0') return 0;
+ if (PS(session_status) != php_session_active) return -1;
if (SG(headers_sent)) {
- const char *output_start_filename = php_output_get_start_filename(TSRMLS_C);
- int output_start_lineno = php_output_get_start_lineno(TSRMLS_C);
+ const char *output_start_filename = php_output_get_start_filename();
+ int output_start_lineno = php_output_get_start_lineno();
- PS(session_status) = php_session_none;
++ php_session_abort();
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, 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");
+ php_error_docref(NULL, E_WARNING, "Cannot send session cache limiter - headers already sent");
}
return -2;
}