mirror of
https://github.com/php/php-src.git
synced 2024-09-22 02:17:32 +00:00
Merge branch 'PHP-8.1' into PHP-8.2
* PHP-8.1: Fix leaking definitions on FFI::cdef()->new()
This commit is contained in:
commit
88fab26365
3
NEWS
3
NEWS
@ -2,6 +2,9 @@ PHP NEWS
|
||||
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||
?? ??? ????, PHP 8.2.10
|
||||
|
||||
- FFI:
|
||||
. Fix leaking definitions when using FFI::cdef()->new(...). (ilutov)
|
||||
|
||||
- Hash:
|
||||
. Fix use-of-uninitialized-value in hash_pbkdf2(), fix missing $options
|
||||
parameter in signature. (ilutov)
|
||||
|
112
ext/ffi/ffi.c
112
ext/ffi/ffi.c
@ -3730,22 +3730,22 @@ 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);
|
||||
if (Z_TYPE(EX(This)) != IS_OBJECT) {
|
||||
if (FFI_G(tags)) {
|
||||
zend_hash_destroy(FFI_G(tags));
|
||||
efree(FFI_G(tags));
|
||||
FFI_G(tags) = NULL;
|
||||
}
|
||||
if (FFI_G(symbols)) {
|
||||
zend_hash_destroy(FFI_G(symbols));
|
||||
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;
|
||||
}
|
||||
return;
|
||||
}
|
||||
@ -3755,15 +3755,13 @@ ZEND_METHOD(FFI, new) /* {{{ */
|
||||
is_const = 1;
|
||||
}
|
||||
|
||||
if (Z_TYPE(EX(This)) != IS_OBJECT) {
|
||||
if (FFI_G(tags)) {
|
||||
zend_ffi_tags_cleanup(&dcl);
|
||||
}
|
||||
if (FFI_G(symbols)) {
|
||||
zend_hash_destroy(FFI_G(symbols));
|
||||
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;
|
||||
}
|
||||
FFI_G(symbols) = NULL;
|
||||
FFI_G(tags) = NULL;
|
||||
@ -3874,22 +3872,22 @@ 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);
|
||||
if (Z_TYPE(EX(This)) != IS_OBJECT) {
|
||||
if (FFI_G(tags)) {
|
||||
zend_hash_destroy(FFI_G(tags));
|
||||
efree(FFI_G(tags));
|
||||
FFI_G(tags) = NULL;
|
||||
}
|
||||
if (FFI_G(symbols)) {
|
||||
zend_hash_destroy(FFI_G(symbols));
|
||||
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;
|
||||
}
|
||||
return;
|
||||
}
|
||||
@ -3899,15 +3897,13 @@ ZEND_METHOD(FFI, cast) /* {{{ */
|
||||
is_const = 1;
|
||||
}
|
||||
|
||||
if (Z_TYPE(EX(This)) != IS_OBJECT) {
|
||||
if (FFI_G(tags)) {
|
||||
zend_ffi_tags_cleanup(&dcl);
|
||||
}
|
||||
if (FFI_G(symbols)) {
|
||||
zend_hash_destroy(FFI_G(symbols));
|
||||
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;
|
||||
}
|
||||
FFI_G(symbols) = NULL;
|
||||
FFI_G(tags) = NULL;
|
||||
@ -4040,35 +4036,33 @@ 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);
|
||||
if (Z_TYPE(EX(This)) != IS_OBJECT) {
|
||||
if (FFI_G(tags)) {
|
||||
zend_hash_destroy(FFI_G(tags));
|
||||
efree(FFI_G(tags));
|
||||
FFI_G(tags) = NULL;
|
||||
}
|
||||
if (FFI_G(symbols)) {
|
||||
zend_hash_destroy(FFI_G(symbols));
|
||||
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;
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
if (Z_TYPE(EX(This)) != IS_OBJECT) {
|
||||
if (FFI_G(tags)) {
|
||||
zend_ffi_tags_cleanup(&dcl);
|
||||
}
|
||||
if (FFI_G(symbols)) {
|
||||
if (clean_symbols && FFI_G(symbols)) {
|
||||
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)
|
||||
}
|
Loading…
Reference in New Issue
Block a user