Merge branch 'PHP-8.2' into PHP-8.3

* PHP-8.2:
  Fix GH-14215: Cannot use FFI::load on CRLF header file with apache2handler
This commit is contained in:
Niels Dossche 2024-05-14 19:52:19 +02:00
commit 0e98a05a3d
No known key found for this signature in database
GPG key ID: B8A8AD166DF0E2E5
6 changed files with 60 additions and 2 deletions

View file

@ -3282,7 +3282,11 @@ static zend_ffi *zend_ffi_load(const char *filename, bool preload) /* {{{ */
code_size = buf.st_size;
code = emalloc(code_size + 1);
fd = open(filename, O_RDONLY, 0);
int open_flags = O_RDONLY;
#ifdef PHP_WIN32
open_flags |= _O_BINARY;
#endif
fd = open(filename, open_flags, 0);
if (fd < 0 || read(fd, code, code_size) != code_size) {
if (preload) {
zend_error(E_WARNING, "FFI: Failed pre-loading '%s', cannot read_file", filename);

3
ext/ffi/tests/gh14215.h Normal file
View file

@ -0,0 +1,3 @@
#define FFI_LIB "Kernel32.dll"
typedef unsigned long DWORD;
DWORD GetLastError(void);

View file

@ -0,0 +1,23 @@
--TEST--
GH-14215 (Cannot use FFI::load on CRLF header file with apache2handler)
--EXTENSIONS--
ffi
zend_test
--SKIPIF--
<?php
if(PHP_OS_FAMILY !== "Windows") {
die('skip only for Windows');
}
?>
--INI--
ffi.enable=1
--FILE--
<?php
zend_test_set_fmode(false);
$header_path = __DIR__.'\\gh14215.h';
$ffi = FFI::load($header_path);
var_dump($ffi->GetLastError());
zend_test_set_fmode(true);
?>
--EXPECT--
int(0)

View file

@ -738,6 +738,18 @@ static ZEND_FUNCTION(zend_test_is_pcre_bundled)
#endif
}
#ifdef PHP_WIN32
static ZEND_FUNCTION(zend_test_set_fmode)
{
bool binary;
ZEND_PARSE_PARAMETERS_START(1, 1)
Z_PARAM_BOOL(binary)
ZEND_PARSE_PARAMETERS_END();
_fmode = binary ? _O_BINARY : _O_TEXT;
}
#endif
static zend_object *zend_test_class_new(zend_class_entry *class_type)
{
zend_object *obj = zend_objects_new(class_type);

View file

@ -246,6 +246,10 @@ function zend_test_override_libxml_global_state(): void {}
#endif
function zend_test_is_pcre_bundled(): bool {}
#if defined(PHP_WIN32)
function zend_test_set_fmode(bool $binary): void {}
#endif
}
namespace ZendTestNS {

View file

@ -1,5 +1,5 @@
/* This is a generated file, edit the .stub.php file instead.
* Stub hash: 39a14fb061199171b0a0a08b821dabcba516ccf5 */
* Stub hash: 4d9128205072443957f6229e09153a04c59cce74 */
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_zend_test_array_return, 0, 0, IS_ARRAY, 0)
ZEND_END_ARG_INFO()
@ -144,6 +144,12 @@ ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_zend_test_is_pcre_bundled, 0, 0, _IS_BOOL, 0)
ZEND_END_ARG_INFO()
#if defined(PHP_WIN32)
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_zend_test_set_fmode, 0, 1, IS_VOID, 0)
ZEND_ARG_TYPE_INFO(0, binary, _IS_BOOL, 0)
ZEND_END_ARG_INFO()
#endif
#define arginfo_ZendTestNS2_namespaced_func arginfo_zend_test_is_pcre_bundled
#define arginfo_ZendTestNS2_namespaced_deprecated_func arginfo_zend_test_void_return
@ -266,6 +272,9 @@ static ZEND_FUNCTION(get_open_basedir);
static ZEND_FUNCTION(zend_test_override_libxml_global_state);
#endif
static ZEND_FUNCTION(zend_test_is_pcre_bundled);
#if defined(PHP_WIN32)
static ZEND_FUNCTION(zend_test_set_fmode);
#endif
static ZEND_FUNCTION(ZendTestNS2_namespaced_func);
static ZEND_FUNCTION(ZendTestNS2_namespaced_deprecated_func);
static ZEND_FUNCTION(ZendTestNS2_ZendSubNS_namespaced_func);
@ -339,6 +348,9 @@ static const zend_function_entry ext_functions[] = {
ZEND_FE(zend_test_override_libxml_global_state, arginfo_zend_test_override_libxml_global_state)
#endif
ZEND_FE(zend_test_is_pcre_bundled, arginfo_zend_test_is_pcre_bundled)
#if defined(PHP_WIN32)
ZEND_FE(zend_test_set_fmode, arginfo_zend_test_set_fmode)
#endif
ZEND_NS_FALIAS("ZendTestNS2", namespaced_func, ZendTestNS2_namespaced_func, arginfo_ZendTestNS2_namespaced_func)
ZEND_NS_DEP_FALIAS("ZendTestNS2", namespaced_deprecated_func, ZendTestNS2_namespaced_deprecated_func, arginfo_ZendTestNS2_namespaced_deprecated_func)
ZEND_NS_FALIAS("ZendTestNS2", namespaced_aliased_func, zend_test_void_return, arginfo_ZendTestNS2_namespaced_aliased_func)