59static zend_result php_session_rfc1867_callback(
unsigned int event,
void *event_data,
void **extra);
60static zend_result (*php_session_rfc1867_orig_callback)(
unsigned int event,
void *event_data,
void **extra);
61static void php_session_track_init(
void);
75#define PS_MAX_SID_LENGTH 256
81#define IF_SESSION_VARS() \
82 if (Z_ISREF_P(&PS(http_session_vars)) && Z_TYPE_P(Z_REFVAL(PS(http_session_vars))) == IS_ARRAY)
84#define SESSION_CHECK_ACTIVE_STATE \
85 if (PS(session_status) == php_session_active) { \
86 php_error_docref(NULL, E_WARNING, "Session ini settings cannot be changed when a session is active"); \
90#define SESSION_CHECK_OUTPUT_STATE \
91 if (SG(headers_sent) && stage != ZEND_INI_STAGE_DEACTIVATE) { \
92 php_error_docref(NULL, E_WARNING, "Session ini settings cannot be changed after headers have already been sent"); \
96#define SESSION_FORBIDDEN_CHARS "=,;.[ \t\r\n\013\014"
97#define SESSION_FORBIDDEN_CHARS_FOR_ERROR_MSG "=,;.[ \\t\\r\\n\\013\\014"
99#define APPLY_TRANS_SID (PS(use_trans_sid) && !PS(use_only_cookies))
105static int my_module_number = 0;
108static inline void php_rinit_session_globals(
void)
114 PS(in_save_handler) = 0;
117 PS(mod_user_is_open) = 0;
120 PS(module_number) = my_module_number;
125static inline void php_session_cleanup_filename(
void)
127 if (
PS(session_started_filename)) {
128 zend_string_release(
PS(session_started_filename));
129 PS(session_started_filename) =
NULL;
130 PS(session_started_lineno) = 0;
136static void php_rshutdown_session_globals(
void)
143 if (
PS(mod_data) ||
PS(mod_user_implemented)) {
145 PS(mod)->s_close(&
PS(mod_data));
158 if (
PS(mod_user_class_name)) {
159 zend_string_release(
PS(mod_user_class_name));
160 PS(mod_user_class_name) =
NULL;
163 php_session_cleanup_filename();
187 php_rshutdown_session_globals();
188 php_rinit_session_globals();
236static void php_session_track_init(
void)
259 return PS(serializer)->encode();
267static ZEND_COLD void php_session_cancel_decode(
void)
270 php_session_track_init();
280 php_session_cancel_decode();
284 php_session_cancel_decode();
297static const char hexconvtab[] =
"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ,-";
299static void bin_to_readable(
unsigned char *in,
size_t inlen,
char *
out,
size_t outlen,
char nbits)
301 unsigned char *
p, *q;
306 p = (
unsigned char *)in;
307 q = (
unsigned char *)in + inlen;
311 mask = (1 << nbits) - 1;
326 *
out++ = hexconvtab[w & mask];
342 if (php_random_bytes_throw(rbuf,
PS(sid_length)) ==
FAILURE) {
346 outid = zend_string_alloc(
PS(sid_length), 0);
348 rbuf,
PS(sid_length),
350 (
char)
PS(sid_bits_per_character));
365 for (
p =
key; (c = *
p);
p++) {
367 if (!((c >=
'a' && c <=
'z')
368 || (c >=
'A' && c <=
'Z')
369 || (c >=
'0' && c <=
'9')
389static zend_long php_session_gc(
bool immediate)
392 bool collect = immediate;
395 if ((
PS(mod_data) ||
PS(mod_user_implemented))) {
396 if (!collect &&
PS(gc_probability) > 0) {
401 PS(mod)->s_gc(&
PS(mod_data),
PS(gc_maxlifetime), &num);
435 PS(
id) =
PS(mod)->s_create_sid(&
PS(mod_data));
443 if (
PS(use_cookies)) {
446 }
else if (
PS(use_strict_mode) &&
PS(mod)->s_validate_sid &&
452 PS(
id) =
PS(mod)->s_create_sid(&
PS(mod_data));
456 if (
PS(use_cookies)) {
467 php_session_track_init();
485 if (
PS(lazy_write)) {
488 php_session_decode(
val);
492 php_session_cleanup_filename();
494 if (session_started_filename !=
NULL) {
495 PS(session_started_filename) = zend_string_copy(session_started_filename);
502static void php_session_save_current_state(
int write)
509 const char *handler_function_name;
511 if (
PS(mod_data) ||
PS(mod_user_implemented)) {
514 val = php_session_encode();
517 &&
PS(mod)->s_update_timestamp
521 ret =
PS(mod)->s_update_timestamp(&
PS(mod_data),
PS(
id),
val,
PS(gc_maxlifetime));
522 handler_function_name = handler_class_name !=
NULL ?
"updateTimestamp" :
"update_timestamp";
524 ret =
PS(mod)->s_write(&
PS(mod_data),
PS(
id),
val,
PS(gc_maxlifetime));
525 handler_function_name =
"write";
530 handler_function_name =
"write";
535 if (!
PS(mod_user_implemented)) {
537 "verify that the current setting of session.save_path "
541 }
else if (handler_class_name !=
NULL) {
543 "defined save handler. (session.save_path: %s, handler: %s::%s)",
PS(save_path),
544 ZSTR_VAL(handler_class_name), handler_function_name);
547 "defined save handler. (session.save_path: %s, handler: %s)",
PS(save_path),
548 handler_function_name);
554 if (
PS(mod_data) ||
PS(mod_user_implemented)) {
555 PS(mod)->s_close(&
PS(mod_data));
560static void php_session_normalize_vars(
void)
594 if (
PG(modules_activated) && !tmp) {
609 PS(default_mod) =
PS(mod);
625 if (
PG(modules_activated) && !tmp) {
640 PS(serializer) = tmp;
675 return OnUpdateString(entry, new_value, mh_arg1, mh_arg2, mh_arg3, stage);
688 || zend_str_has_nul_byte(new_value)
707 return OnUpdateStringUnempty(entry, new_value, mh_arg1, mh_arg2, mh_arg3, stage);
717#ifdef ZEND_ENABLE_ZVAL_LONG64
726 }
else if (
v > maxcookie) {
729 return OnUpdateLongGEZero(entry, new_value, mh_arg1, mh_arg2, mh_arg3, stage);
738 return OnUpdateLong(entry, new_value, mh_arg1, mh_arg2, mh_arg3, stage);
747 return OnUpdateString(entry, new_value, mh_arg1, mh_arg2, mh_arg3, stage);
756 return OnUpdateBool(entry, new_value, mh_arg1, mh_arg2, mh_arg3, stage);
775 PS(sid_length) =
val;
798 PS(sid_bits_per_character) =
val;
807static PHP_INI_MH(OnUpdateSessionGcProbability)
857 PS(rfc1867_freq) = -tmp;
859 PS(rfc1867_freq) = tmp;
895 return OnUpdateString(entry, new_value, mh_arg1, mh_arg2, mh_arg3, stage);
992#define PS_BIN_NR_OF_BITS 8
993#define PS_BIN_UNDEF (1<<(PS_BIN_NR_OF_BITS-1))
994#define PS_BIN_MAX (PS_BIN_UNDEF-1)
1045 php_session_normalize_vars();
1052 php_session_normalize_vars();
1059#define PS_DELIMITER '|'
1074 smart_str_free(&
buf);
1112 goto break_outer_loop;
1127 goto break_outer_loop;
1134 php_session_normalize_vars();
1142#define MAX_SERIALIZERS 32
1143#define PREDEFINED_SERIALIZERS 3
1156 if (ps_serializers[i].
name ==
NULL) {
1157 ps_serializers[i].name =
name;
1158 ps_serializers[i].encode =
encode;
1159 ps_serializers[i].decode = decode;
1160 ps_serializers[i + 1].name =
NULL;
1173#define MAX_MODULES 32
1174#define PREDEFINED_MODULES 2
1186 if (!ps_modules[i]) {
1187 ps_modules[i] =
ptr;
1218#define CACHE_LIMITER(name) _php_cache_limiter_##name
1219#define CACHE_LIMITER_FUNC(name) static void CACHE_LIMITER(name)(void)
1220#define CACHE_LIMITER_ENTRY(name) { #name, CACHE_LIMITER(name) },
1221#define ADD_HEADER(a) sapi_add_header(a, strlen(a), 1);
1224static const char *month_names[] = {
1225 "Jan",
"Feb",
"Mar",
"Apr",
"May",
"Jun",
1226 "Jul",
"Aug",
"Sep",
"Oct",
"Nov",
"Dec"
1229static const char *week_days[] = {
1230 "Sun",
"Mon",
"Tue",
"Wed",
"Thu",
"Fri",
"Sat",
"Sun"
1233static inline void strcpy_gmt(
char *ubuf, time_t *when)
1247 week_days[tm.tm_wday], tm.tm_mday,
1248 month_names[tm.tm_mon], tm.tm_year + 1900,
1249 tm.tm_hour, tm.tm_min,
1256static inline void last_modified(
void)
1262 path =
SG(request_info).path_translated;
1268#define LAST_MODIFIED "Last-Modified: "
1276#define EXPIRES "Expires: "
1284 now =
tv.tv_sec +
PS(cache_expire) * 60;
1309 ADD_HEADER(
"Expires: Thu, 19 Nov 1981 08:52:00 GMT");
1316 ADD_HEADER(
"Expires: Thu, 19 Nov 1981 08:52:00 GMT");
1319 ADD_HEADER(
"Cache-Control: no-store, no-cache, must-revalidate");
1334static int php_session_cache_limiter(
void)
1338 if (
PS(cache_limiter)[0] ==
'\0')
return 0;
1345 php_session_abort();
1354 for (lim = php_session_cache_limiters; lim->
name; lim++) {
1374static void php_session_remove_cookie(
void) {
1379 char *session_cookie;
1380 size_t session_cookie_len;
1381 size_t len =
sizeof(
"Set-Cookie")-1;
1386 session_cookie_len =
strlen(session_cookie);
1392 && !
strncmp(
header->header, session_cookie, session_cookie_len)) {
1409 efree(session_cookie);
1435 smart_str_appendl(&ncookie,
"Set-Cookie: ",
sizeof(
"Set-Cookie: ")-1);
1437 smart_str_appendc(&ncookie,
'=');
1442 if (
PS(cookie_lifetime) > 0) {
1447 t =
tv.tv_sec +
PS(cookie_lifetime);
1450 date_fmt =
php_format_date(
"D, d M Y H:i:s \\G\\M\\T",
sizeof(
"D, d M Y H:i:s \\G\\M\\T")-1, t, 0);
1456 smart_str_append_long(&ncookie,
PS(cookie_lifetime));
1460 if (
PS(cookie_path)[0]) {
1462 smart_str_appends(&ncookie,
PS(cookie_path));
1465 if (
PS(cookie_domain)[0]) {
1467 smart_str_appends(&ncookie,
PS(cookie_domain));
1470 if (
PS(cookie_secure)) {
1474 if (
PS(cookie_httponly)) {
1478 if (
PS(cookie_samesite)[0]) {
1480 smart_str_appends(&ncookie,
PS(cookie_samesite));
1483 smart_str_0(&ncookie);
1485 php_session_remove_cookie();
1489 smart_str_free(&ncookie);
1501 for (i = 0, mod = ps_modules; i <
MAX_MODULES; i++, mod++) {
1516 for (mod = ps_serializers; mod->
name; mod++) {
1526static void ppid2sid(
zval *ppid) {
1530 PS(send_cookie) = 0;
1533 PS(send_cookie) = 1;
1540 int module_number =
PS(module_number);
1542 bool apply_trans_sid;
1549 if (
PS(use_cookies) &&
PS(send_cookie)) {
1550 zend_result cookies_sent = php_session_send_cookie();
1554 PS(send_cookie) = 0;
1562 if (
PS(define_sid)) {
1566 smart_str_appendc(&var,
'=');
1571 ZVAL_STR(sid, smart_str_extract(&var));
1574 smart_str_free(&var);
1586 apply_trans_sid = 0;
1588 apply_trans_sid = 1;
1589 if (
PS(use_cookies) &&
1595 apply_trans_sid = 0;
1599 if (apply_trans_sid) {
1620 if (
PS(session_started_filename)) {
1621 php_error(
E_NOTICE,
"Ignoring session_start() because a session has already been started (started from %s on line %"PRIu32
")",
ZSTR_VAL(
PS(session_started_filename)),
PS(session_started_lineno));
1622 }
else if (
PS(auto_start)) {
1624 php_error(
E_NOTICE,
"Ignoring session_start() because a session has already been started automatically");
1626 php_error(
E_NOTICE,
"Ignoring session_start() because a session has already been started");
1640 value =
zend_ini_string(
"session.serialize_handler",
sizeof(
"session.serialize_handler") - 1, 0);
1641 if (!
PS(serializer) &&
value) {
1643 if (!
PS(serializer)) {
1654 PS(define_sid) = !
PS(use_only_cookies);
1655 PS(send_cookie) =
PS(use_cookies) ||
PS(use_only_cookies);
1673 PS(send_cookie) = 0;
1678 if (!
PS(use_only_cookies)) {
1693 if (
PS(
id) &&
PS(extern_referer_chk)[0] !=
'\0' &&
1713 if (php_session_initialize() ==
FAILURE
1714 || php_session_cache_limiter() == -2) {
1730 php_session_save_current_state(write);
1746 if (
PS(mod_data) ||
PS(mod_user_implemented)) {
1747 PS(mod)->s_close(&
PS(mod_data));
1759 && php_session_initialize() ==
SUCCESS) {
1789 bool secure = 0, secure_null = 1;
1790 bool httponly = 0, httponly_null = 1;
1804 if (!
PS(use_cookies)) {
1838 if (!httponly_null) {
1846 lifetime = zval_get_string(
value);
1849 path = zval_get_string(
value);
1852 domain = zval_get_string(
value);
1863 samesite = zval_get_string(
value);
1922 if (!httponly_null) {
1944 if (lifetime) zend_string_release(lifetime);
1946 if (path) zend_string_release(path);
1947 if (domain) zend_string_release(domain);
1948 if (samesite) zend_string_release(samesite);
2022 if (
PS(mod) &&
PS(mod)->s_name) {
2039 if (
PS(mod_data) ||
PS(mod_user_implemented)) {
2040 PS(mod)->s_close(&
PS(mod_data));
2051static bool can_session_handler_be_changed(
void) {
2065static inline void set_user_save_handler_ini(
void) {
2070 PS(set_handler) = 1;
2072 PS(set_handler) = 0;
2077#define SESSION_RELEASE_USER_HANDLER_OO(struct_name) \
2078 if (!Z_ISUNDEF(PS(mod_user_names).struct_name)) { \
2079 zval_ptr_dtor(&PS(mod_user_names).struct_name); \
2080 ZVAL_UNDEF(&PS(mod_user_names).struct_name); \
2083#define SESSION_SET_USER_HANDLER_OO(struct_name, zstr_method_name) \
2084 array_init_size(&PS(mod_user_names).struct_name, 2); \
2086 add_next_index_zval(&PS(mod_user_names).struct_name, obj); \
2087 add_next_index_str(&PS(mod_user_names).struct_name, zstr_method_name);
2089#define SESSION_SET_USER_HANDLER_OO_MANDATORY(struct_name, method_name) \
2090 if (!Z_ISUNDEF(PS(mod_user_names).struct_name)) { \
2091 zval_ptr_dtor(&PS(mod_user_names).struct_name); \
2093 array_init_size(&PS(mod_user_names).struct_name, 2); \
2095 add_next_index_zval(&PS(mod_user_names).struct_name, obj); \
2096 add_next_index_str(&PS(mod_user_names).struct_name, zend_string_init(method_name, strlen(method_name), false));
2098#define SESSION_SET_USER_HANDLER_PROCEDURAL(struct_name, fci) \
2099 if (!Z_ISUNDEF(PS(mod_user_names).struct_name)) { \
2100 zval_ptr_dtor(&PS(mod_user_names).struct_name); \
2102 ZVAL_COPY(&PS(mod_user_names).struct_name, &fci.function_name);
2104#define SESSION_SET_USER_HANDLER_PROCEDURAL_OPTIONAL(struct_name, fci) \
2105 if (ZEND_FCI_INITIALIZED(fci)) { \
2106 SESSION_SET_USER_HANDLER_PROCEDURAL(struct_name, fci); \
2115 bool register_shutdown = 1;
2121 if (!can_session_handler_be_changed()) {
2125 if (
PS(mod_user_class_name)) {
2126 zend_string_release(
PS(mod_user_class_name));
2147 }
else if (zend_hash_find_ptr(object_methods, create_sid_name)) {
2167 if (zend_hash_find_ptr(object_methods, validate_sid_name)) {
2171 if (zend_hash_find_ptr(object_methods, update_timestamp_name)) {
2179 if (register_shutdown) {
2185 ZVAL_STRING(&callable,
"session_register_shutdown");
2203 set_user_save_handler_ini();
2236 &open_fci, &open_fcc,
2237 &close_fci, &close_fcc,
2238 &read_fci, &read_fcc,
2239 &write_fci, &write_fcc,
2240 &destroy_fci, &destroy_fcc,
2242 &create_id_fci, &create_id_fcc,
2243 &validate_id_fci, &validate_id_fcc,
2244 &update_timestamp_fci, &update_timestamp_fcc) ==
FAILURE
2248 if (!can_session_handler_be_changed()) {
2253 if (
PS(mod_user_class_name)) {
2254 zend_string_release(
PS(mod_user_class_name));
2255 PS(mod_user_class_name) =
NULL;
2262 set_user_save_handler_ini();
2348 PS(
id) = zend_string_copy(
name);
2376 PS(mod)->s_close(&
PS(mod_data));
2385 data = php_session_encode();
2387 ret =
PS(mod)->s_write(&
PS(mod_data),
PS(
id),
data,
PS(gc_maxlifetime));
2393 PS(mod)->s_close(&
PS(mod_data));
2399 PS(mod)->s_close(&
PS(mod_data));
2417 PS(
id) =
PS(mod)->s_create_sid(&
PS(mod_data));
2425 if (
PS(use_strict_mode)) {
2426 if ((!
PS(mod_user_implemented) &&
PS(mod)->s_validate_sid) || !
Z_ISUNDEF(
PS(mod_user_names).ps_validate_sid)) {
2429 while (limit-- &&
PS(mod)->s_validate_sid(&
PS(mod_data),
PS(
id)) ==
SUCCESS) {
2431 PS(
id) =
PS(mod)->s_create_sid(&
PS(mod_data));
2433 PS(mod)->s_close(&
PS(mod_data));
2446 PS(mod)->s_close(&
PS(mod_data));
2457 if (
PS(use_cookies)) {
2458 PS(send_cookie) = 1;
2485 php_error_docref(
NULL,
E_WARNING,
"Prefix cannot contain special characters. Only the A-Z, a-z, 0-9, \"-\", and \",\" characters are allowed");
2488 smart_str_append(&
id,
prefix);
2495 new_id =
PS(mod)->s_create_sid(&
PS(mod_data));
2496 if (!
PS(mod)->s_validate_sid || (
PS(mod_user_implemented) &&
Z_ISUNDEF(
PS(mod_user_names).ps_validate_sid))) {
2500 if (
PS(mod)->s_validate_sid(&
PS(mod_data), new_id) ==
SUCCESS) {
2513 smart_str_append(&
id, new_id);
2516 smart_str_free(&
id);
2558 bool expires_is_null = 1;
2576 if (!expires_is_null) {
2595 enc = php_session_encode();
2618 if (php_session_decode(str) ==
FAILURE) {
2628 smart_str_appends(&
buf,
"session");
2629 smart_str_appendc(&
buf,
'.');
2630 smart_str_append(&
buf, varname);
2633 smart_str_free(&
buf);
2651 if (
PS(session_started_filename)) {
2652 php_error_docref(
NULL,
E_NOTICE,
"Ignoring session_start() because a session is already active (started from %s on line %"PRIu32
")",
ZSTR_VAL(
PS(session_started_filename)),
PS(session_started_lineno));
2653 }
else if (
PS(auto_start)) {
2682 read_and_close = zval_get_long(
value);
2686 if (php_session_start_set_ini(str_idx,
val) ==
FAILURE) {
2689 zend_tmp_string_release(tmp_val);
2693 zend_type_error(
"%s(): Option \"%s\" must be of type string|int|bool, %s given",
2715 if (read_and_close) {
2770 num = php_session_gc(1);
2805 php_session_abort();
2820 php_session_reset();
2876static zend_result php_rinit_session(
bool auto_start)
2878 php_rinit_session_globals();
2890 if (
PS(serializer) ==
NULL) {
2893 value =
zend_ini_string(
"session.serialize_handler",
sizeof(
"session.serialize_handler") - 1, 0);
2914 return php_rinit_session(
PS(auto_start));
2918#define SESSION_FREE_USER_HANDLER(struct_name) \
2919 if (!Z_ISUNDEF(PS(mod_user_names).struct_name)) { \
2920 zval_ptr_dtor(&PS(mod_user_names).struct_name); \
2921 ZVAL_UNDEF(&PS(mod_user_names).struct_name); \
2932 php_rshutdown_session_globals();
2952#if defined(COMPILE_DL_SESSION) && defined(ZTS)
2956 ps_globals->save_path =
NULL;
2957 ps_globals->session_name =
NULL;
2958 ps_globals->id =
NULL;
2959 ps_globals->mod =
NULL;
2960 ps_globals->serializer =
NULL;
2961 ps_globals->mod_data =
NULL;
2963 ps_globals->default_mod =
NULL;
2964 ps_globals->mod_user_implemented = 0;
2965 ps_globals->mod_user_class_name =
NULL;
2966 ps_globals->mod_user_is_open = 0;
2967 ps_globals->session_vars =
NULL;
2968 ps_globals->set_handler = 0;
2969 ps_globals->session_started_filename =
NULL;
2970 ps_globals->session_started_lineno = 0;
2972 ZVAL_UNDEF(&ps_globals->mod_user_names.ps_open);
2973 ZVAL_UNDEF(&ps_globals->mod_user_names.ps_close);
2974 ZVAL_UNDEF(&ps_globals->mod_user_names.ps_read);
2975 ZVAL_UNDEF(&ps_globals->mod_user_names.ps_write);
2976 ZVAL_UNDEF(&ps_globals->mod_user_names.ps_destroy);
2977 ZVAL_UNDEF(&ps_globals->mod_user_names.ps_gc);
2978 ZVAL_UNDEF(&ps_globals->mod_user_names.ps_create_sid);
2979 ZVAL_UNDEF(&ps_globals->mod_user_names.ps_validate_sid);
2980 ZVAL_UNDEF(&ps_globals->mod_user_names.ps_update_timestamp);
2985 .state = &ps_globals->random_state,
2988 if (php_random_bytes_silent(&seed,
sizeof(seed)) ==
FAILURE) {
2989 seed = php_random_uint128_constant(
3002 my_module_number = module_number;
3003 PS(module_number) = module_number;
3024 register_session_symbols(module_number);
3039 php_session_rfc1867_orig_callback =
NULL;
3060 for (i = 0, mod = ps_modules; i <
MAX_MODULES; i++, mod++) {
3061 if (*mod && (*mod)->s_name) {
3062 smart_str_appends(&save_handlers, (*mod)->s_name);
3063 smart_str_appendc(&save_handlers,
' ');
3070 smart_str_appends(&ser_handlers, ser->
name);
3071 smart_str_appendc(&ser_handlers,
' ');
3078 if (save_handlers.
s) {
3079 smart_str_0(&save_handlers);
3081 smart_str_free(&save_handlers);
3086 if (ser_handlers.
s) {
3087 smart_str_0(&ser_handlers);
3089 smart_str_free(&ser_handlers);
3131 if (
PS(use_cookies)) {
3138 if (
PS(use_only_cookies)) {
3147 zval *progress_ary, *cancel_upload;
3163 if (!force_update) {
3167#ifdef HAVE_GETTIMEOFDAY
3168 if (
PS(rfc1867_min_freq) > 0.0) {
3169 struct timeval
tv = {0};
3172 dtv = (double)
tv.tv_sec +
tv.tv_usec / 1000000.0;
3173 if (dtv < progress->next_update_time) {
3182 php_session_initialize();
3188 progress->
cancel_upload |= php_check_cancel_upload(progress);
3197 php_session_initialize();
3207static zend_result php_session_rfc1867_callback(
unsigned int event,
void *event_data,
void **extra)
3212 if (php_session_rfc1867_orig_callback) {
3213 retval = php_session_rfc1867_orig_callback(event, event_data, extra);
3215 if (!
PS(rfc1867_enabled)) {
3219 progress =
PS(rfc1867_progress);
3227 PS(rfc1867_progress) = progress;
3239 if (
data->newlength) {
3240 value_len = *
data->newlength;
3242 value_len =
data->length;
3245 if (
data->name &&
data->value && value_len) {
3251 }
else if (name_len ==
strlen(
PS(rfc1867_name)) && memcmp(
data->name,
PS(rfc1867_name), name_len + 1) == 0) {
3252 smart_str_free(&progress->
key);
3253 smart_str_appends(&progress->
key,
PS(rfc1867_prefix));
3254 smart_str_appendl(&progress->
key, *
data->value, value_len);
3255 smart_str_0(&progress->
key);
3258 php_session_rfc1867_early_find_sid(progress);
3275 if (
PS(rfc1867_freq) >= 0) {
3277 }
else if (
PS(rfc1867_freq) < 0) {
3294 php_rinit_session(0);
3298 PS(use_trans_sid) = 1;
3299 PS(use_only_cookies) = 0;
3301 PS(send_cookie) = 0;
3321 php_session_rfc1867_update(progress, 0);
3334 php_session_rfc1867_update(progress, 0);
3344 if (
data->temp_filename) {
3353 php_session_rfc1867_update(progress, 0);
3360 if (
PS(rfc1867_cleanup)) {
3361 php_session_rfc1867_cleanup(progress);
3367 php_session_rfc1867_update(progress, 1);
3370 php_rshutdown_session_globals();
3377 smart_str_free(&progress->
key);
3380 PS(rfc1867_progress) =
NULL;
3409#ifdef COMPILE_DL_SESSION
SAPI_API double sapi_get_request_time(void)
SAPI_API sapi_module_struct sapi_module
SAPI_API void sapi_free_header(sapi_header_struct *sapi_header)
SAPI_API int sapi_add_header_ex(const char *header_line, size_t header_line_len, bool duplicate, bool replace)
PHPAPI bool remove_user_shutdown_function(const char *function_name, size_t function_len)
PHPAPI bool append_user_shutdown_function(php_shutdown_function_entry *shutdown_function_entry)
PHPAPI bool register_user_shutdown_function(const char *function_name, size_t function_len, php_shutdown_function_entry *shutdown_function_entry)
struct _php_shutdown_function_entry php_shutdown_function_entry
gettimeofday(bool $as_float=false)
strpbrk(string $string, string $characters)
header(string $header, bool $replace=true, int $response_code=0)
strstr(string $haystack, string $needle, bool $before_needle=false)
strchr(string $haystack, string $needle, bool $before_needle=false)
headers_sent(&$filename=null, &$line=null)
PHPAPI void php_random_pcgoneseq128xslrr64_seed128(php_random_status_state_pcgoneseq128xslrr64 *s, php_random_uint128_t seed)
PHPAPI const php_random_algo php_random_algo_pcgoneseq128xslrr64
memset(ptr, 0, type->size)
zend_ffi_ctype_name_buf buf
PHPAPI int php_check_open_basedir(const char *path)
PHPAPI ZEND_COLD void php_error_docref(const char *docref, int type, const char *format,...)
const ps_module ps_mod_user
PHPAPI const char * php_output_get_start_filename(void)
PHPAPI int php_output_get_start_lineno(void)
php_info_print_table_start()
php_info_print_table_row(2, "PDO Driver for Firebird", "enabled")
php_info_print_table_end()
#define PHP_MSHUTDOWN_FUNCTION
#define PHP_MINIT_FUNCTION
#define PHP_MINFO_FUNCTION
#define PHP_GINIT_FUNCTION
#define PHP_RINIT_FUNCTION
#define PHP_RSHUTDOWN_FUNCTION
#define PHP_MODULE_GLOBALS
PHPAPI zend_string * php_format_date(const char *format, size_t format_len, time_t ts, bool localtime)
#define TRACK_VARS_SERVER
#define TRACK_VARS_COOKIE
#define PHP_INI_STAGE_RUNTIME
#define STD_PHP_INI_ENTRY
#define STD_PHP_INI_BOOLEAN
#define PHP_INI_STAGE_HTACCESS
PHP_JSON_API size_t int options
zend_string * output_start_filename
struct _php_random_algo_with_state php_random_algo_with_state
PHPAPI uint64_t php_random_generate_fallback_seed(void)
PHPAPI zend_long php_random_range(php_random_algo_with_state engine, zend_long min, zend_long max)
struct _php_random_uint128_t php_random_uint128_t
PHPAPI struct tm * php_gmtime_r(const time_t *const timep, struct tm *p_tm)
unsigned char key[REFLECTION_KEY_LEN]
zend_module_entry session_module_entry
PHPAPI zend_class_entry * php_session_update_timestamp_iface_entry
#define PS_VALIDATE_SID_ARGS
#define PS_CREATE_SID_ARGS
struct ps_module_struct ps_module
#define PS_UPDATE_TIMESTAMP_ARGS
PHPAPI zend_result php_session_update_timestamp(PS_UPDATE_TIMESTAMP_ARGS)
struct ps_serializer_struct ps_serializer
#define PHP_SESSION_VERSION
#define PS_SERIALIZER_DECODE_ARGS
#define PS_SERIALIZER_ENTRY(x)
PHPAPI zend_class_entry * php_session_iface_entry
struct _php_session_rfc1867_progress php_session_rfc1867_progress
#define PS_ENCODE_LOOP(code)
#define PS_SERIALIZER_DECODE_FUNC(x)
struct _php_ps_globals php_ps_globals
PHPAPI zend_class_entry * php_session_class_entry
#define PS_SERIALIZER_ENCODE_FUNC(x)
PHPAPI zend_class_entry * php_session_id_iface_entry
#define PS_SERIALIZER_ENCODE_ARGS
#define PHP_VAR_UNSERIALIZE_DESTROY(d)
struct php_unserialize_data * php_unserialize_data_t
struct php_serialize_data * php_serialize_data_t
#define PHP_VAR_UNSERIALIZE_INIT(d)
PHPAPI zval * var_tmp_var(php_unserialize_data_t *var_hashx)
PHPAPI int php_var_unserialize(zval *rval, const unsigned char **p, const unsigned char *max, php_unserialize_data_t *var_hash)
#define PHP_VAR_SERIALIZE_INIT(d)
PHPAPI void php_var_serialize(smart_str *buf, zval *struc, php_serialize_data_t *data)
#define PHP_VAR_SERIALIZE_DESTROY(d)
PHPAPI zend_result(* php_rfc1867_callback)(unsigned int event, void *event_data, void **extra)
struct _multipart_event_file_end multipart_event_file_end
#define MULTIPART_EVENT_FILE_END
struct _multipart_event_formdata multipart_event_formdata
#define MULTIPART_EVENT_FORMDATA
struct _multipart_event_start multipart_event_start
#define MULTIPART_EVENT_START
struct _multipart_event_file_data multipart_event_file_data
#define MULTIPART_EVENT_END
#define MULTIPART_EVENT_FILE_START
#define MULTIPART_EVENT_FILE_DATA
struct _multipart_event_end multipart_event_end
struct _multipart_event_file_start multipart_event_file_start
PHPAPI zend_result php_session_destroy(void)
PHPAPI zval * php_set_session_var(zend_string *name, zval *state_val, php_unserialize_data_t *var_hash)
PHPAPI php_session_status php_get_session_status(void)
#define SESSION_CHECK_OUTPUT_STATE
memcpy(buf, EXPIRES, sizeof(EXPIRES) - 1)
#define SESSION_SET_USER_HANDLER_OO(struct_name, zstr_method_name)
PHPAPI zend_result php_session_valid_key(const char *key)
PHPAPI void session_adapt_url(const char *url, size_t url_len, char **new_url, size_t *new_len)
#define CACHE_LIMITER_FUNC(name)
PHPAPI zend_result php_session_reset_id(void)
#define SESSION_RELEASE_USER_HANDLER_OO(struct_name)
PHPAPI void php_add_session_var(zend_string *name)
#define SESSION_SET_USER_HANDLER_PROCEDURAL_OPTIONAL(struct_name, fci)
PHPAPI zval * php_get_session_var(zend_string *name)
#define SESSION_FORBIDDEN_CHARS
#define PREDEFINED_SERIALIZERS
PHPAPI zend_result php_session_register_serializer(const char *name, zend_string *(*encode)(PS_SERIALIZER_ENCODE_ARGS), zend_result(*decode)(PS_SERIALIZER_DECODE_ARGS))
PHPAPI zend_result php_session_update_timestamp(PS_UPDATE_TIMESTAMP_ARGS)
zend_string_release_ex(var_name, 0)
#define PS_MAX_SID_LENGTH
#define PREDEFINED_MODULES
PHPAPI zend_result php_session_flush(int write)
#define SESSION_FREE_USER_HANDLER(struct_name)
PHPAPI const ps_serializer * _php_find_ps_serializer(const char *name)
PHPAPI zend_result php_session_start(void)
#define CACHE_LIMITER(name)
#define SESSION_CHECK_ACTIVE_STATE
#define SESSION_SET_USER_HANDLER_PROCEDURAL(struct_name, fci)
PHPAPI const ps_module * _php_find_ps_module(const char *name)
PHPAPI zval * php_get_session_var_str(const char *name, size_t name_len)
php_unserialize_data_t var_hash
#define SESSION_FORBIDDEN_CHARS_FOR_ERROR_MSG
#define SESSION_SET_USER_HANDLER_OO_MANDATORY(struct_name, method_name)
PHPAPI zend_result php_session_validate_sid(PS_VALIDATE_SID_ARGS)
PHPAPI zend_string * php_session_create_id(PS_CREATE_SID_ARGS)
#define IF_SESSION_VARS()
CACHE_LIMITER private_no_expire()
PHPAPI zend_result php_session_register_module(const ps_module *ptr)
#define CACHE_LIMITER_ENTRY(name)
session_id(?string $id=null)
session_name(?string $name=null)
session_cache_expire(?int $value=null)
session_create_id(string $prefix="")
session_set_save_handler( $open, $close=UNKNOWN, callable $read=UNKNOWN, callable $write=UNKNOWN, callable $destroy=UNKNOWN, callable $gc=UNKNOWN, ?callable $create_sid=null, ?callable $validate_sid=null, ?callable $update_timestamp=null)
session_decode(string $data)
session_get_cookie_params()
session_register_shutdown()
session_start(array $options=[])
session_save_path(?string $path=null)
session_set_cookie_params(array|int $lifetime_or_options, ?string $path=null, ?string $domain=null, ?bool $secure=null, ?bool $httponly=null)
session_module_name(?string $module=null)
session_cache_limiter(?string $value=null)
session_regenerate_id(bool $delete_old_session=false)
zval * current_file_bytes_processed
zval * post_bytes_processed
zend_fcall_info_cache fci_cache
zend_llist_element * head
zend_llist_element * tail
PHPAPI zend_string * php_url_encode(char const *s, size_t len)
PHPAPI char * php_url_scanner_adapt_single_url(const char *url, size_t urllen, const char *name, const char *value, size_t *newlen, bool encode)
PHPAPI zend_result php_url_scanner_reset_session_var(zend_string *name, int encode)
PHPAPI zend_result php_url_scanner_add_session_var(const char *name, size_t name_len, const char *value, size_t value_len, bool encode)
ZEND_API ZEND_COLD void zend_throw_error(zend_class_entry *exception_ce, const char *format,...)
ZEND_API ZEND_COLD void zend_type_error(const char *format,...)
#define ZEND_TSRMLS_CACHE_UPDATE()
#define ZEND_TSRMLS_CACHE_DEFINE()
ZEND_API const char * zend_zval_value_name(const zval *arg)
ZEND_API void add_assoc_bool_ex(zval *arg, const char *key, size_t key_len, bool b)
ZEND_API zend_result zend_fcall_info_init(zval *callable, uint32_t check_flags, zend_fcall_info *fci, zend_fcall_info_cache *fcc, zend_string **callable_name, char **error)
ZEND_API void add_assoc_string_ex(zval *arg, const char *key, size_t key_len, const char *str)
ZEND_API zend_result zend_parse_parameters(uint32_t num_args, const char *type_spec,...)
ZEND_API void add_assoc_zval_ex(zval *arg, const char *key, size_t key_len, zval *value)
ZEND_API void add_assoc_long_ex(zval *arg, const char *key, size_t key_len, zend_long n)
ZEND_API ZEND_COLD void zend_argument_value_error(uint32_t arg_num, const char *format,...)
ZEND_API void add_assoc_null_ex(zval *arg, const char *key, size_t key_len)
struct _zend_fcall_info_cache zend_fcall_info_cache
#define ZEND_PARSE_PARAMETERS_END()
#define Z_PARAM_STR_OR_NULL(dest)
#define ZEND_PARSE_PARAMETERS_NONE()
#define ZVAL_STRING(z, s)
#define ZEND_DECLARE_MODULE_GLOBALS(module_name)
#define RETVAL_STR_COPY(s)
#define RETVAL_NEW_STR(s)
#define ZEND_GET_MODULE(name)
#define zend_parse_parameters_none()
#define ZEND_PARSE_PARAMETERS_START(min_num_args, max_num_args)
#define RETVAL_EMPTY_STRING()
#define Z_PARAM_BOOL_OR_NULL(dest, is_null)
struct _zend_fcall_info zend_fcall_info
ZEND_API zend_result zend_delete_global_variable(zend_string *name)
#define ZVAL_STRINGL(z, s, l)
#define Z_PARAM_ARRAY_HT_OR_LONG(dest_ht, dest_long)
#define ZVAL_EMPTY_STRING(z)
#define estrndup(s, length)
#define ecalloc(nmemb, size)
strncmp(string $string1, string $string2, int $length)
ZEND_API zend_result zend_register_auto_global(zend_string *name, bool jit, zend_auto_global_callback auto_global_callback)
#define strcasecmp(s1, s2)
ZEND_API zval * zend_get_constant_str(const char *name, size_t name_len)
#define REGISTER_STRINGL_CONSTANT(name, str, len, flags)
ZEND_API void(ZEND_FASTCALL *zend_touch_vm_stack_data)(void *vm_stack_data)
ZEND_API const char * get_active_function_name(void)
ZEND_API uint32_t zend_get_executed_lineno(void)
ZEND_API zend_string * zend_get_executed_filename_ex(void)
ZEND_API zval *ZEND_FASTCALL zend_hash_str_find(const HashTable *ht, const char *str, size_t len)
ZEND_API void ZEND_FASTCALL zend_hash_clean(HashTable *ht)
ZEND_API zval *ZEND_FASTCALL zend_hash_update_ind(HashTable *ht, zend_string *key, zval *pData)
ZEND_API zval *ZEND_FASTCALL zend_hash_update(HashTable *ht, zend_string *key, zval *pData)
ZEND_API zend_result ZEND_FASTCALL zend_hash_del(HashTable *ht, zend_string *key)
ZEND_API zval *ZEND_FASTCALL zend_hash_find(const HashTable *ht, zend_string *key)
#define ZEND_HASH_FOREACH_KEY_VAL(ht, _h, _key, _val)
#define ZEND_HASH_FOREACH_STR_KEY_VAL(ht, _key, _val)
#define ZEND_HASH_FOREACH_END()
ZEND_API zend_result zend_alter_ini_entry_ex(zend_string *name, zend_string *new_value, int modify_type, int stage, bool force_change)
ZEND_API zend_result zend_alter_ini_entry_chars(zend_string *name, const char *value, size_t value_length, int modify_type, int stage)
ZEND_API bool zend_ini_parse_bool(zend_string *str)
ZEND_API zend_long zend_ini_parse_quantity_warn(zend_string *value, zend_string *setting)
ZEND_API char * zend_ini_string(const char *name, size_t name_length, int orig)
ZEND_API zend_result zend_alter_ini_entry(zend_string *name, zend_string *new_value, int modify_type, int stage)
#define ZEND_INI_STAGE_ACTIVATE
#define ZEND_INI_STAGE_STARTUP
#define UNREGISTER_INI_ENTRIES()
#define REGISTER_INI_ENTRIES()
#define DISPLAY_INI_ENTRIES()
#define ZEND_INI_STAGE_DEACTIVATE
#define ZEND_INI_GET_ADDR()
#define ZEND_INI_STAGE_RUNTIME
struct _zend_llist_element zend_llist_element
struct _zend_llist zend_llist
#define ZEND_STRTOL(s0, s1, base)
struct _zend_string zend_string
#define SHUTDOWN_FUNC_ARGS_PASSTHRU
#define INIT_FUNC_ARGS_PASSTHRU
#define ZEND_MOD_OPTIONAL(name)
struct _zend_module_dep zend_module_dep
struct _zend_module_entry zend_module_entry
#define STANDARD_MODULE_PROPERTIES_EX
#define STANDARD_MODULE_HEADER_EX
ZEND_API zend_string *ZEND_FASTCALL zend_long_to_str(zend_long num)
ZEND_API uint8_t ZEND_FASTCALL is_numeric_str_function(const zend_string *str, zend_long *lval, double *dval)
#define ZEND_UNREACHABLE()
#define UNEXPECTED(condition)
struct _zend_class_entry zend_class_entry
ZEND_API zend_string_init_interned_func_t zend_string_init_interned
#define ZSTR_INIT_LITERAL(s, persistent)
#define zend_string_equals_literal(str, literal)
#define ZSTR_EMPTY_ALLOC()
#define zend_string_equals_ci(s1, s2)
#define zend_string_equals_literal_ci(str, c)
#define Z_STRVAL_P(zval_p)
#define Z_ARRVAL_P(zval_p)
struct _zend_array HashTable
#define ZVAL_COPY_DEREF(z, v)
#define ZVAL_NEW_REF(z, r)
#define Z_STRLEN_P(zval_p)
#define Z_OBJCE_P(zval_p)
ZEND_RESULT_CODE zend_result
#define SEPARATE_ARRAY(zv)
#define ZVAL_COPY_VALUE(z, v)
ZEND_API void zval_ptr_dtor(zval *zval_ptr)
#define VCWD_STAT(path, buff)