mirror of
https://github.com/php/php-src.git
synced 2026-03-24 00:02:20 +01:00
Merge branch 'PHP-8.2'
* PHP-8.2: Fix leaking definitions on FFI::cdef()->new()
This commit is contained in:
3
NEWS
3
NEWS
@@ -2,6 +2,9 @@ PHP NEWS
|
||||
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||
?? ??? ????, PHP 8.3.0beta2
|
||||
|
||||
- FFI:
|
||||
. Fix leaking definitions when using FFI::cdef()->new(...). (ilutov)
|
||||
|
||||
- Streams:
|
||||
. Fixed bug GH-11735 (Use-after-free when unregistering user stream wrapper
|
||||
from itself). (ilutov)
|
||||
|
||||
@@ -3773,11 +3773,14 @@ ZEND_METHOD(FFI, new) /* {{{ */
|
||||
FFI_G(symbols) = NULL;
|
||||
FFI_G(tags) = NULL;
|
||||
}
|
||||
bool clean_symbols = FFI_G(symbols) == NULL;
|
||||
bool clean_tags = FFI_G(tags) == NULL;
|
||||
|
||||
FFI_G(default_type_attr) = 0;
|
||||
|
||||
if (zend_ffi_parse_type(ZSTR_VAL(type_def), ZSTR_LEN(type_def), &dcl) == FAILURE) {
|
||||
zend_ffi_type_dtor(dcl.type);
|
||||
<<<<<<< HEAD
|
||||
if (is_static_call) {
|
||||
if (FFI_G(tags)) {
|
||||
zend_hash_destroy(FFI_G(tags));
|
||||
@@ -3789,6 +3792,17 @@ ZEND_METHOD(FFI, new) /* {{{ */
|
||||
efree(FFI_G(symbols));
|
||||
FFI_G(symbols) = NULL;
|
||||
}
|
||||
=======
|
||||
if (clean_tags && FFI_G(tags)) {
|
||||
zend_hash_destroy(FFI_G(tags));
|
||||
efree(FFI_G(tags));
|
||||
FFI_G(tags) = NULL;
|
||||
}
|
||||
if (clean_symbols && FFI_G(symbols)) {
|
||||
zend_hash_destroy(FFI_G(symbols));
|
||||
efree(FFI_G(symbols));
|
||||
FFI_G(symbols) = NULL;
|
||||
>>>>>>> PHP-8.2
|
||||
}
|
||||
return;
|
||||
}
|
||||
@@ -3798,6 +3812,7 @@ ZEND_METHOD(FFI, new) /* {{{ */
|
||||
is_const = 1;
|
||||
}
|
||||
|
||||
<<<<<<< HEAD
|
||||
if (is_static_call) {
|
||||
if (FFI_G(tags)) {
|
||||
zend_ffi_tags_cleanup(&dcl);
|
||||
@@ -3807,6 +3822,15 @@ ZEND_METHOD(FFI, new) /* {{{ */
|
||||
efree(FFI_G(symbols));
|
||||
FFI_G(symbols) = NULL;
|
||||
}
|
||||
=======
|
||||
if (clean_tags && FFI_G(tags)) {
|
||||
zend_ffi_tags_cleanup(&dcl);
|
||||
}
|
||||
if (clean_symbols && FFI_G(symbols)) {
|
||||
zend_hash_destroy(FFI_G(symbols));
|
||||
efree(FFI_G(symbols));
|
||||
FFI_G(symbols) = NULL;
|
||||
>>>>>>> PHP-8.2
|
||||
}
|
||||
FFI_G(symbols) = NULL;
|
||||
FFI_G(tags) = NULL;
|
||||
@@ -3925,11 +3949,14 @@ ZEND_METHOD(FFI, cast) /* {{{ */
|
||||
FFI_G(symbols) = NULL;
|
||||
FFI_G(tags) = NULL;
|
||||
}
|
||||
bool clean_symbols = FFI_G(symbols) == NULL;
|
||||
bool clean_tags = FFI_G(tags) == NULL;
|
||||
|
||||
FFI_G(default_type_attr) = 0;
|
||||
|
||||
if (zend_ffi_parse_type(ZSTR_VAL(type_def), ZSTR_LEN(type_def), &dcl) == FAILURE) {
|
||||
zend_ffi_type_dtor(dcl.type);
|
||||
<<<<<<< HEAD
|
||||
if (is_static_call) {
|
||||
if (FFI_G(tags)) {
|
||||
zend_hash_destroy(FFI_G(tags));
|
||||
@@ -3941,6 +3968,17 @@ ZEND_METHOD(FFI, cast) /* {{{ */
|
||||
efree(FFI_G(symbols));
|
||||
FFI_G(symbols) = NULL;
|
||||
}
|
||||
=======
|
||||
if (clean_tags && FFI_G(tags)) {
|
||||
zend_hash_destroy(FFI_G(tags));
|
||||
efree(FFI_G(tags));
|
||||
FFI_G(tags) = NULL;
|
||||
}
|
||||
if (clean_symbols && FFI_G(symbols)) {
|
||||
zend_hash_destroy(FFI_G(symbols));
|
||||
efree(FFI_G(symbols));
|
||||
FFI_G(symbols) = NULL;
|
||||
>>>>>>> PHP-8.2
|
||||
}
|
||||
return;
|
||||
}
|
||||
@@ -3950,6 +3988,7 @@ ZEND_METHOD(FFI, cast) /* {{{ */
|
||||
is_const = 1;
|
||||
}
|
||||
|
||||
<<<<<<< HEAD
|
||||
if (is_static_call) {
|
||||
if (FFI_G(tags)) {
|
||||
zend_ffi_tags_cleanup(&dcl);
|
||||
@@ -3959,6 +3998,15 @@ ZEND_METHOD(FFI, cast) /* {{{ */
|
||||
efree(FFI_G(symbols));
|
||||
FFI_G(symbols) = NULL;
|
||||
}
|
||||
=======
|
||||
if (clean_tags && FFI_G(tags)) {
|
||||
zend_ffi_tags_cleanup(&dcl);
|
||||
}
|
||||
if (clean_symbols && FFI_G(symbols)) {
|
||||
zend_hash_destroy(FFI_G(symbols));
|
||||
efree(FFI_G(symbols));
|
||||
FFI_G(symbols) = NULL;
|
||||
>>>>>>> PHP-8.2
|
||||
}
|
||||
FFI_G(symbols) = NULL;
|
||||
FFI_G(tags) = NULL;
|
||||
@@ -4099,11 +4147,14 @@ ZEND_METHOD(FFI, type) /* {{{ */
|
||||
FFI_G(symbols) = NULL;
|
||||
FFI_G(tags) = NULL;
|
||||
}
|
||||
bool clean_symbols = FFI_G(symbols) == NULL;
|
||||
bool clean_tags = FFI_G(tags) == NULL;
|
||||
|
||||
FFI_G(default_type_attr) = 0;
|
||||
|
||||
if (zend_ffi_parse_type(ZSTR_VAL(type_def), ZSTR_LEN(type_def), &dcl) == FAILURE) {
|
||||
zend_ffi_type_dtor(dcl.type);
|
||||
<<<<<<< HEAD
|
||||
if (is_static_call) {
|
||||
if (FFI_G(tags)) {
|
||||
zend_hash_destroy(FFI_G(tags));
|
||||
@@ -4124,10 +4175,28 @@ ZEND_METHOD(FFI, type) /* {{{ */
|
||||
zend_ffi_tags_cleanup(&dcl);
|
||||
}
|
||||
if (FFI_G(symbols)) {
|
||||
=======
|
||||
if (clean_tags && FFI_G(tags)) {
|
||||
zend_hash_destroy(FFI_G(tags));
|
||||
efree(FFI_G(tags));
|
||||
FFI_G(tags) = NULL;
|
||||
}
|
||||
if (clean_symbols && FFI_G(symbols)) {
|
||||
>>>>>>> PHP-8.2
|
||||
zend_hash_destroy(FFI_G(symbols));
|
||||
efree(FFI_G(symbols));
|
||||
FFI_G(symbols) = NULL;
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
if (clean_tags && FFI_G(tags)) {
|
||||
zend_ffi_tags_cleanup(&dcl);
|
||||
}
|
||||
if (clean_symbols && FFI_G(symbols)) {
|
||||
zend_hash_destroy(FFI_G(symbols));
|
||||
efree(FFI_G(symbols));
|
||||
FFI_G(symbols) = NULL;
|
||||
}
|
||||
FFI_G(symbols) = NULL;
|
||||
FFI_G(tags) = NULL;
|
||||
|
||||
14
ext/ffi/tests/cdef_new.phpt
Normal file
14
ext/ffi/tests/cdef_new.phpt
Normal file
@@ -0,0 +1,14 @@
|
||||
--TEST--
|
||||
Definitions should not leak when using FFI::cdef()->new(...)
|
||||
--EXTENSIONS--
|
||||
ffi
|
||||
--FILE--
|
||||
<?php
|
||||
$struct = \FFI::cdef()->new('struct Example { uint32_t x; }');
|
||||
var_dump($struct);
|
||||
?>
|
||||
--EXPECT--
|
||||
object(FFI\CData:struct Example)#2 (1) {
|
||||
["x"]=>
|
||||
int(0)
|
||||
}
|
||||
Reference in New Issue
Block a user