Skip to content

Commit 88fab26

Browse files
committed
Merge branch 'PHP-8.1' into PHP-8.2
* PHP-8.1: Fix leaking definitions on FFI::cdef()->new()
2 parents ad666eb + 11d6bea commit 88fab26

File tree

3 files changed

+70
-59
lines changed

3 files changed

+70
-59
lines changed

NEWS

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,9 @@ PHP NEWS
22
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
33
?? ??? ????, PHP 8.2.10
44

5+
- FFI:
6+
. Fix leaking definitions when using FFI::cdef()->new(...). (ilutov)
7+
58
- Hash:
69
. Fix use-of-uninitialized-value in hash_pbkdf2(), fix missing $options
710
parameter in signature. (ilutov)

ext/ffi/ffi.c

Lines changed: 53 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -3730,22 +3730,22 @@ ZEND_METHOD(FFI, new) /* {{{ */
37303730
FFI_G(symbols) = NULL;
37313731
FFI_G(tags) = NULL;
37323732
}
3733+
bool clean_symbols = FFI_G(symbols) == NULL;
3734+
bool clean_tags = FFI_G(tags) == NULL;
37333735

37343736
FFI_G(default_type_attr) = 0;
37353737

37363738
if (zend_ffi_parse_type(ZSTR_VAL(type_def), ZSTR_LEN(type_def), &dcl) == FAILURE) {
37373739
zend_ffi_type_dtor(dcl.type);
3738-
if (Z_TYPE(EX(This)) != IS_OBJECT) {
3739-
if (FFI_G(tags)) {
3740-
zend_hash_destroy(FFI_G(tags));
3741-
efree(FFI_G(tags));
3742-
FFI_G(tags) = NULL;
3743-
}
3744-
if (FFI_G(symbols)) {
3745-
zend_hash_destroy(FFI_G(symbols));
3746-
efree(FFI_G(symbols));
3747-
FFI_G(symbols) = NULL;
3748-
}
3740+
if (clean_tags && FFI_G(tags)) {
3741+
zend_hash_destroy(FFI_G(tags));
3742+
efree(FFI_G(tags));
3743+
FFI_G(tags) = NULL;
3744+
}
3745+
if (clean_symbols && FFI_G(symbols)) {
3746+
zend_hash_destroy(FFI_G(symbols));
3747+
efree(FFI_G(symbols));
3748+
FFI_G(symbols) = NULL;
37493749
}
37503750
return;
37513751
}
@@ -3755,15 +3755,13 @@ ZEND_METHOD(FFI, new) /* {{{ */
37553755
is_const = 1;
37563756
}
37573757

3758-
if (Z_TYPE(EX(This)) != IS_OBJECT) {
3759-
if (FFI_G(tags)) {
3760-
zend_ffi_tags_cleanup(&dcl);
3761-
}
3762-
if (FFI_G(symbols)) {
3763-
zend_hash_destroy(FFI_G(symbols));
3764-
efree(FFI_G(symbols));
3765-
FFI_G(symbols) = NULL;
3766-
}
3758+
if (clean_tags && FFI_G(tags)) {
3759+
zend_ffi_tags_cleanup(&dcl);
3760+
}
3761+
if (clean_symbols && FFI_G(symbols)) {
3762+
zend_hash_destroy(FFI_G(symbols));
3763+
efree(FFI_G(symbols));
3764+
FFI_G(symbols) = NULL;
37673765
}
37683766
FFI_G(symbols) = NULL;
37693767
FFI_G(tags) = NULL;
@@ -3874,22 +3872,22 @@ ZEND_METHOD(FFI, cast) /* {{{ */
38743872
FFI_G(symbols) = NULL;
38753873
FFI_G(tags) = NULL;
38763874
}
3875+
bool clean_symbols = FFI_G(symbols) == NULL;
3876+
bool clean_tags = FFI_G(tags) == NULL;
38773877

38783878
FFI_G(default_type_attr) = 0;
38793879

38803880
if (zend_ffi_parse_type(ZSTR_VAL(type_def), ZSTR_LEN(type_def), &dcl) == FAILURE) {
38813881
zend_ffi_type_dtor(dcl.type);
3882-
if (Z_TYPE(EX(This)) != IS_OBJECT) {
3883-
if (FFI_G(tags)) {
3884-
zend_hash_destroy(FFI_G(tags));
3885-
efree(FFI_G(tags));
3886-
FFI_G(tags) = NULL;
3887-
}
3888-
if (FFI_G(symbols)) {
3889-
zend_hash_destroy(FFI_G(symbols));
3890-
efree(FFI_G(symbols));
3891-
FFI_G(symbols) = NULL;
3892-
}
3882+
if (clean_tags && FFI_G(tags)) {
3883+
zend_hash_destroy(FFI_G(tags));
3884+
efree(FFI_G(tags));
3885+
FFI_G(tags) = NULL;
3886+
}
3887+
if (clean_symbols && FFI_G(symbols)) {
3888+
zend_hash_destroy(FFI_G(symbols));
3889+
efree(FFI_G(symbols));
3890+
FFI_G(symbols) = NULL;
38933891
}
38943892
return;
38953893
}
@@ -3899,15 +3897,13 @@ ZEND_METHOD(FFI, cast) /* {{{ */
38993897
is_const = 1;
39003898
}
39013899

3902-
if (Z_TYPE(EX(This)) != IS_OBJECT) {
3903-
if (FFI_G(tags)) {
3904-
zend_ffi_tags_cleanup(&dcl);
3905-
}
3906-
if (FFI_G(symbols)) {
3907-
zend_hash_destroy(FFI_G(symbols));
3908-
efree(FFI_G(symbols));
3909-
FFI_G(symbols) = NULL;
3910-
}
3900+
if (clean_tags && FFI_G(tags)) {
3901+
zend_ffi_tags_cleanup(&dcl);
3902+
}
3903+
if (clean_symbols && FFI_G(symbols)) {
3904+
zend_hash_destroy(FFI_G(symbols));
3905+
efree(FFI_G(symbols));
3906+
FFI_G(symbols) = NULL;
39113907
}
39123908
FFI_G(symbols) = NULL;
39133909
FFI_G(tags) = NULL;
@@ -4040,35 +4036,33 @@ ZEND_METHOD(FFI, type) /* {{{ */
40404036
FFI_G(symbols) = NULL;
40414037
FFI_G(tags) = NULL;
40424038
}
4039+
bool clean_symbols = FFI_G(symbols) == NULL;
4040+
bool clean_tags = FFI_G(tags) == NULL;
40434041

40444042
FFI_G(default_type_attr) = 0;
40454043

40464044
if (zend_ffi_parse_type(ZSTR_VAL(type_def), ZSTR_LEN(type_def), &dcl) == FAILURE) {
40474045
zend_ffi_type_dtor(dcl.type);
4048-
if (Z_TYPE(EX(This)) != IS_OBJECT) {
4049-
if (FFI_G(tags)) {
4050-
zend_hash_destroy(FFI_G(tags));
4051-
efree(FFI_G(tags));
4052-
FFI_G(tags) = NULL;
4053-
}
4054-
if (FFI_G(symbols)) {
4055-
zend_hash_destroy(FFI_G(symbols));
4056-
efree(FFI_G(symbols));
4057-
FFI_G(symbols) = NULL;
4058-
}
4059-
}
4060-
return;
4061-
}
4062-
4063-
if (Z_TYPE(EX(This)) != IS_OBJECT) {
4064-
if (FFI_G(tags)) {
4065-
zend_ffi_tags_cleanup(&dcl);
4046+
if (clean_tags && FFI_G(tags)) {
4047+
zend_hash_destroy(FFI_G(tags));
4048+
efree(FFI_G(tags));
4049+
FFI_G(tags) = NULL;
40664050
}
4067-
if (FFI_G(symbols)) {
4051+
if (clean_symbols && FFI_G(symbols)) {
40684052
zend_hash_destroy(FFI_G(symbols));
40694053
efree(FFI_G(symbols));
40704054
FFI_G(symbols) = NULL;
40714055
}
4056+
return;
4057+
}
4058+
4059+
if (clean_tags && FFI_G(tags)) {
4060+
zend_ffi_tags_cleanup(&dcl);
4061+
}
4062+
if (clean_symbols && FFI_G(symbols)) {
4063+
zend_hash_destroy(FFI_G(symbols));
4064+
efree(FFI_G(symbols));
4065+
FFI_G(symbols) = NULL;
40724066
}
40734067
FFI_G(symbols) = NULL;
40744068
FFI_G(tags) = NULL;

ext/ffi/tests/cdef_new.phpt

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
--TEST--
2+
Definitions should not leak when using FFI::cdef()->new(...)
3+
--EXTENSIONS--
4+
ffi
5+
--FILE--
6+
<?php
7+
$struct = \FFI::cdef()->new('struct Example { uint32_t x; }');
8+
var_dump($struct);
9+
?>
10+
--EXPECT--
11+
object(FFI\CData:struct Example)#2 (1) {
12+
["x"]=>
13+
int(0)
14+
}

0 commit comments

Comments
 (0)