Skip to content

Commit 1db0bad

Browse files
committed
Fixed bug #78488 (OOB in ZEND_FUNCTION(ffi_trampoline)).
1 parent 94e2f25 commit 1db0bad

File tree

2 files changed

+11
-5
lines changed

2 files changed

+11
-5
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 7.4.0RC2
44

5+
- FFI:
6+
. Fixed bug #78488 (OOB in ZEND_FUNCTION(ffi_trampoline)). (Dmitry)
7+
58
- Opcache:
69
. Add opcache.preload_user INI directive. (Dmitry)
710

ext/ffi/ffi.c

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -160,6 +160,9 @@ typedef struct _zend_ffi {
160160
#define ZEND_FFI_TYPE_MAKE_OWNED(t) \
161161
((zend_ffi_type*)(((uintptr_t)(t)) | ZEND_FFI_TYPE_OWNED))
162162

163+
#define ZEND_FFI_SIZEOF_ARG \
164+
MAX(FFI_SIZEOF_ARG, sizeof(double))
165+
163166
typedef struct _zend_ffi_cdata {
164167
zend_object std;
165168
zend_ffi_type *type;
@@ -2614,12 +2617,12 @@ static ZEND_FUNCTION(ffi_trampoline) /* {{{ */
26142617
arg_types = do_alloca(
26152618
sizeof(ffi_type*) * EX_NUM_ARGS(), arg_types_use_heap);
26162619
arg_values = do_alloca(
2617-
(sizeof(void*) + FFI_SIZEOF_ARG) * EX_NUM_ARGS(), arg_values_use_heap);
2620+
(sizeof(void*) + ZEND_FFI_SIZEOF_ARG) * EX_NUM_ARGS(), arg_values_use_heap);
26182621
n = 0;
26192622
if (type->func.args) {
26202623
ZEND_HASH_FOREACH_PTR(type->func.args, arg_type) {
26212624
arg_type = ZEND_FFI_TYPE(arg_type);
2622-
arg_values[n] = ((char*)arg_values) + (sizeof(void*) * EX_NUM_ARGS()) + (FFI_SIZEOF_ARG * n);
2625+
arg_values[n] = ((char*)arg_values) + (sizeof(void*) * EX_NUM_ARGS()) + (ZEND_FFI_SIZEOF_ARG * n);
26232626
if (zend_ffi_pass_arg(EX_VAR_NUM(n), arg_type, &arg_types[n], arg_values, n, execute_data) != SUCCESS) {
26242627
free_alloca(arg_types, arg_types_use_heap);
26252628
free_alloca(arg_values, arg_values_use_heap);
@@ -2629,7 +2632,7 @@ static ZEND_FUNCTION(ffi_trampoline) /* {{{ */
26292632
} ZEND_HASH_FOREACH_END();
26302633
}
26312634
for (; n < EX_NUM_ARGS(); n++) {
2632-
arg_values[n] = ((char*)arg_values) + (sizeof(void*) * EX_NUM_ARGS()) + (FFI_SIZEOF_ARG * n);
2635+
arg_values[n] = ((char*)arg_values) + (sizeof(void*) * EX_NUM_ARGS()) + (ZEND_FFI_SIZEOF_ARG * n);
26332636
if (zend_ffi_pass_var_arg(EX_VAR_NUM(n), &arg_types[n], arg_values, n, execute_data) != SUCCESS) {
26342637
free_alloca(arg_types, arg_types_use_heap);
26352638
free_alloca(arg_values, arg_values_use_heap);
@@ -2659,12 +2662,12 @@ static ZEND_FUNCTION(ffi_trampoline) /* {{{ */
26592662
arg_types = do_alloca(
26602663
(sizeof(ffi_type*) + sizeof(ffi_type)) * EX_NUM_ARGS(), arg_types_use_heap);
26612664
arg_values = do_alloca(
2662-
(sizeof(void*) + FFI_SIZEOF_ARG) * EX_NUM_ARGS(), arg_values_use_heap);
2665+
(sizeof(void*) + ZEND_FFI_SIZEOF_ARG) * EX_NUM_ARGS(), arg_values_use_heap);
26632666
n = 0;
26642667
if (type->func.args) {
26652668
ZEND_HASH_FOREACH_PTR(type->func.args, arg_type) {
26662669
arg_type = ZEND_FFI_TYPE(arg_type);
2667-
arg_values[n] = ((char*)arg_values) + (sizeof(void*) * EX_NUM_ARGS()) + (FFI_SIZEOF_ARG * n);
2670+
arg_values[n] = ((char*)arg_values) + (sizeof(void*) * EX_NUM_ARGS()) + (ZEND_FFI_SIZEOF_ARG * n);
26682671
if (zend_ffi_pass_arg(EX_VAR_NUM(n), arg_type, &arg_types[n], arg_values, n, execute_data) != SUCCESS) {
26692672
free_alloca(arg_types, arg_types_use_heap);
26702673
free_alloca(arg_values, arg_values_use_heap);

0 commit comments

Comments
 (0)