From ee5e383c6bbca94d5f93134510468b3fe87a470c Mon Sep 17 00:00:00 2001 From: jvoisin Date: Sun, 31 Aug 2025 16:05:44 +0200 Subject: [PATCH] Add support for PHP8.5 --- .github/workflows/builds.yml | 1 + src/sp_cookie_encryption.c | 23 +++++++++++++++++-- ...isabled_functions_shell_exec_backtick.phpt | 1 + ...led_functions_shell_exec_backtick_var.phpt | 1 + ...ctions_shell_exec_backtick_var_string.phpt | 1 + 5 files changed, 25 insertions(+), 2 deletions(-) diff --git a/src/sp_cookie_encryption.c b/src/sp_cookie_encryption.c index c833f943..ec5c7c2d 100644 --- a/src/sp_cookie_encryption.c +++ b/src/sp_cookie_encryption.c @@ -48,7 +48,11 @@ static zend_string *encrypt_data(zend_string *data) { #if PHP_VERSION_ID >= 70300 static void php_head_parse_cookie_options_array( zval *options, zend_long *expires, zend_string **path, zend_string **domain, - zend_bool *secure, zend_bool *httponly, zend_string **samesite) { + zend_bool *secure, zend_bool *httponly, zend_string **samesite +#if PHP_VERSION_ID >= 80500 + ,bool *partitioned +#endif + ) { int found = 0; zend_string *key; zval *value; @@ -73,6 +77,11 @@ static void php_head_parse_cookie_options_array( } else if (zend_string_equals_literal_ci(key, "samesite")) { *samesite = zval_get_string(value); found++; +#if PHP_VERSION_ID >= 80500 + } else if (zend_string_equals_literal_ci(key, "partitioned")) { + *partitioned = zval_is_true(value); + found++; +#endif } else { php_error_docref(NULL, E_WARNING, "Unrecognized key '%s' found in the options array", @@ -94,6 +103,9 @@ static void php_head_parse_cookie_options_array( #endif PHP_FUNCTION(sp_setcookie) { +#if PHP_VERSION_ID >= 80500 + zend_bool partitioned; +#endif zend_string *name = NULL, *value = NULL, *path = NULL, *domain = NULL, *value_enc = NULL, #if PHP_VERSION_ID < 70300 @@ -133,7 +145,11 @@ PHP_FUNCTION(sp_setcookie) { } php_head_parse_cookie_options_array(expires_or_options, &expires, &path, &domain, &secure, &httponly, +#if PHP_VERSION_ID < 80500 &samesite); +#else + &samesite, &partitioned); +#endif } else { expires = zval_get_long(expires_or_options); } @@ -194,9 +210,12 @@ PHP_FUNCTION(sp_setcookie) { if (php_setcookie(name, (value_enc ? value_enc : value), expires, (path_samesite ? path_samesite : path), domain, secure, 1, httponly) == SUCCESS) { -#else +#elif PHP_VERSION_ID < 80500 if (php_setcookie(name, (value_enc ? value_enc : value), expires, path, domain, secure, httponly, samesite, 1) == SUCCESS) { +#else + if (php_setcookie(name, (value_enc ? value_enc : value), expires, path, + domain, secure, httponly, samesite, partitioned, false) == SUCCESS) { #endif RETVAL_TRUE; } else { diff --git a/src/tests/disable_function/disabled_functions_shell_exec_backtick.phpt b/src/tests/disable_function/disabled_functions_shell_exec_backtick.phpt index aeb64c29..6f53ceae 100644 --- a/src/tests/disable_function/disabled_functions_shell_exec_backtick.phpt +++ b/src/tests/disable_function/disabled_functions_shell_exec_backtick.phpt @@ -4,6 +4,7 @@ Disable functions - shell_exec via backtick operator --INI-- sp.configuration_file={PWD}/config/disabled_functions_extra.ini +error_reporting = E_ALL & ~E_DEPRECATED --FILE-- --INI-- sp.configuration_file={PWD}/config/disabled_functions_extra.ini +error_reporting = E_ALL & ~E_DEPRECATED --FILE-- --INI-- sp.configuration_file={PWD}/config/disabled_functions_extra.ini +error_reporting = E_ALL & ~E_DEPRECATED --FILE-- Date: Wed, 1 Oct 2025 13:44:06 +0200 Subject: [PATCH] Fix a cookie-related warning for PHP8.5.0 ``` ========DIFF======== 001- OK 001+ Fatal error: Uncaught ValueError: setcookie(): "partitioned" option cannot be used without "secure" option in /builddir/build/BUILD/snuffleupagus-1c7598c432551d0c49c2c57f249ccd5ccabce638/src/tests/samesite_cookies.php:2 002+ Stack trace: 003+ #0 /builddir/build/BUILD/snuffleupagus-1c7598c432551d0c49c2c57f249ccd5ccabce638/src/tests/samesite_cookies.php(2): setcookie('super_cookie', 'super_value') 004+ #1 {main} 005+ thrown in /builddir/build/BUILD/snuffleupagus-1c7598c432551d0c49c2c57f249ccd5ccabce638/src/tests/samesite_cookies.php on line 2 ========DONE======== FAIL Cookie samesite [tests/samesite_cookies.phpt] ``` Even though the warning might be spurious, let's fix this properly, by initialising `partitioned` to false, and by setting it only if `secure` is set as well. --- src/sp_cookie_encryption.c | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/src/sp_cookie_encryption.c b/src/sp_cookie_encryption.c index ec5c7c2d..888d2178 100644 --- a/src/sp_cookie_encryption.c +++ b/src/sp_cookie_encryption.c @@ -104,7 +104,7 @@ static void php_head_parse_cookie_options_array( PHP_FUNCTION(sp_setcookie) { #if PHP_VERSION_ID >= 80500 - zend_bool partitioned; + zend_bool partitioned = false; #endif zend_string *name = NULL, *value = NULL, *path = NULL, *domain = NULL, *value_enc = NULL, @@ -144,12 +144,11 @@ PHP_FUNCTION(sp_setcookie) { RETURN_FALSE; } php_head_parse_cookie_options_array(expires_or_options, &expires, &path, - &domain, &secure, &httponly, -#if PHP_VERSION_ID < 80500 - &samesite); -#else - &samesite, &partitioned); + &domain, &secure, &httponly, &samesite +#if PHP_VERSION_ID >= 80500 + , &partitioned #endif + ); } else { expires = zval_get_long(expires_or_options); } @@ -214,6 +213,10 @@ PHP_FUNCTION(sp_setcookie) { if (php_setcookie(name, (value_enc ? value_enc : value), expires, path, domain, secure, httponly, samesite, 1) == SUCCESS) { #else + if (!secure) { + // Can't have partitioned cookies without the secure flag. + partitioned = false; + } if (php_setcookie(name, (value_enc ? value_enc : value), expires, path, domain, secure, httponly, samesite, partitioned, false) == SUCCESS) { #endif