1
0
mirror of https://github.com/php/php-src.git synced 2026-03-24 00:02:20 +01:00

ext/session: use zend_strings for open handler

This commit is contained in:
Gina Peter Banyard
2026-02-06 17:51:48 +00:00
parent ba17532fed
commit 71096cd873
6 changed files with 22 additions and 17 deletions

View File

@@ -100,6 +100,10 @@ PHP 8.6 INTERNALS UPGRADE NOTES
- ext/session:
. php_session_flush() now returns a bool rather than a zend_result.
. Removed session_adapt_url().
. PS_OPEN_ARGS is now defined as
`void **mod_data, zend_string *save_path, zend_string *session_name`
rather than
`void **mod_data, const char *save_path, const char *session_name`
- ext/standard:
. _php_error_log() now has a formal return type of zend_result.

View File

@@ -369,19 +369,22 @@ PS_OPEN_FUNC(files)
int argc = 0;
size_t dirdepth = 0;
int filemode = 0600;
const char *used_save_path;
if (*save_path == '\0') {
if (ZSTR_LEN(save_path) == 0) {
/* if save path is an empty string, determine the temporary dir */
save_path = php_get_temporary_directory();
used_save_path = php_get_temporary_directory();
if (php_check_open_basedir(save_path)) {
if (php_check_open_basedir(used_save_path)) {
return FAILURE;
}
} else {
used_save_path = ZSTR_VAL(save_path);
}
/* split up input parameter */
last = save_path;
p = strchr(save_path, ';');
last = used_save_path;
p = strchr(used_save_path, ';');
while (p) {
argv[argc++] = last;
last = ++p;
@@ -407,14 +410,14 @@ PS_OPEN_FUNC(files)
return FAILURE;
}
}
save_path = argv[argc - 1];
used_save_path = argv[argc - 1];
data = ecalloc(1, sizeof(*data));
data->fd = -1;
data->dirdepth = dirdepth;
data->filemode = filemode;
data->basedir = zend_string_init(save_path, strlen(save_path), /* persistent */ false);
data->basedir = zend_string_init(used_save_path, strlen(used_save_path), /* persistent */ false);
if (PS_GET_MOD_DATA()) {
ps_close_files(mod_data);

View File

@@ -83,12 +83,11 @@ PS_OPEN_FUNC(user)
{
zval args[2];
zval retval;
zend_result ret = FAILURE;
ZEND_ASSERT(!Z_ISUNDEF(PSF(open)));
ZVAL_STRING(&args[0], (char*)save_path);
ZVAL_STRING(&args[1], (char*)session_name);
ZVAL_STR(&args[0], zend_string_dup(save_path, false));
ZVAL_STR(&args[1], zend_string_dup(session_name, false));
zend_try {
ps_call_handler(&PSF(open), 2, args, &retval);
@@ -102,7 +101,7 @@ PS_OPEN_FUNC(user)
PS(mod_user_implemented) = true;
ret = verify_bool_return_type_userland_calls(&retval);
zend_result ret = verify_bool_return_type_userland_calls(&retval);
zval_ptr_dtor(&retval);
return ret;
}

View File

@@ -36,11 +36,10 @@
PHP_METHOD(SessionHandler, open)
{
char *save_path = NULL, *session_name = NULL;
size_t save_path_len, session_name_len;
zend_string *save_path, *session_name;
zend_result ret;
if (zend_parse_parameters(ZEND_NUM_ARGS(), "ss", &save_path, &save_path_len, &session_name, &session_name_len) == FAILURE) {
if (zend_parse_parameters(ZEND_NUM_ARGS(), "SS", &save_path, &session_name) == FAILURE) {
RETURN_THROWS();
}

View File

@@ -26,7 +26,7 @@
#define PHP_SESSION_VERSION PHP_VERSION
/* save handler macros */
#define PS_OPEN_ARGS void **mod_data, const char *save_path, const char *session_name
#define PS_OPEN_ARGS void **mod_data, zend_string *save_path, zend_string *session_name
#define PS_CLOSE_ARGS void **mod_data
#define PS_READ_ARGS void **mod_data, zend_string *key, zend_string **val, zend_long maxlifetime
#define PS_WRITE_ARGS void **mod_data, zend_string *key, zend_string *val, zend_long maxlifetime

View File

@@ -424,7 +424,7 @@ static zend_result php_session_initialize(void)
}
/* Open session handler first */
if (PS(mod)->s_open(&PS(mod_data), ZSTR_VAL(PS(save_path)), ZSTR_VAL(PS(session_name))) == FAILURE
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();
@@ -2351,7 +2351,7 @@ PHP_FUNCTION(session_regenerate_id)
zend_string_release_ex(PS(id), false);
PS(id) = NULL;
if (PS(mod)->s_open(&PS(mod_data), ZSTR_VAL(PS(save_path)), ZSTR_VAL(PS(session_name))) == FAILURE) {
if (PS(mod)->s_open(&PS(mod_data), PS(save_path), PS(session_name)) == FAILURE) {
PS(session_status) = php_session_none;
if (!EG(exception)) {
zend_throw_error(NULL, "Failed to open session: %s (path: %s)", PS(mod)->s_name, ZSTR_VAL(PS(save_path)));