From: Dmitry Stogov Date: Tue, 10 Sep 2019 08:23:12 +0000 (+0300) Subject: NEWS entry, test and minor cleanup for FFI::isNull() X-Git-Tag: php-7.4.0RC2~56 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=21c3cdf66824a0522779fa252a675173d02dc724;p=php NEWS entry, test and minor cleanup for FFI::isNull() --- diff --git a/NEWS b/NEWS index 695ec84407..9563d6c368 100644 --- a/NEWS +++ b/NEWS @@ -3,6 +3,7 @@ PHP NEWS ?? ??? ????, PHP 7.4.0RC2 - FFI: + . Added missing FFI::isNull(). (Philip Hofstetter) . Fixed bug #78488 (OOB in ZEND_FUNCTION(ffi_trampoline)). (Dmitry) - Opcache: diff --git a/ext/ffi/ffi.c b/ext/ffi/ffi.c index 83838ae6a1..1d6f84b6b2 100644 --- a/ext/ffi/ffi.c +++ b/ext/ffi/ffi.c @@ -4364,8 +4364,8 @@ ZEND_METHOD(FFI, string) /* {{{ */ ZEND_METHOD(FFI, isNull) /* {{{ */ { zval *zv; + zend_ffi_cdata *cdata; zend_ffi_type *type; - void *ptr = NULL; ZEND_FFI_VALIDATE_API_RESTRICTION(); ZEND_PARSE_PARAMETERS_START(1, 1) @@ -4373,20 +4373,20 @@ ZEND_METHOD(FFI, isNull) /* {{{ */ ZEND_PARSE_PARAMETERS_END(); ZVAL_DEREF(zv); - if (Z_TYPE_P(zv) == IS_OBJECT && Z_OBJCE_P(zv) == zend_ffi_cdata_ce) { - zend_ffi_cdata *cdata = (zend_ffi_cdata*)Z_OBJ_P(zv); - type = ZEND_FFI_TYPE(cdata->type); - ptr = cdata->ptr; - } else { + if (Z_TYPE_P(zv) != IS_OBJECT || Z_OBJCE_P(zv) != zend_ffi_cdata_ce) { zend_wrong_parameter_class_error(1, "FFI\\CData", zv); return; } + cdata = (zend_ffi_cdata*)Z_OBJ_P(zv); + type = ZEND_FFI_TYPE(cdata->type); + if (type->kind != ZEND_FFI_TYPE_POINTER){ zend_throw_error(zend_ffi_exception_ce, "FFI\\Cdata is not a pointer"); + return; } - RETURN_BOOL(*(void**)ptr == NULL); + RETURN_BOOL(*(void**)cdata->ptr == NULL); } /* }}} */ diff --git a/ext/ffi/tests/045.phpt b/ext/ffi/tests/045.phpt new file mode 100644 index 0000000000..7118df9eb7 --- /dev/null +++ b/ext/ffi/tests/045.phpt @@ -0,0 +1,29 @@ +--TEST-- +FFI 045: FFI::isNull() +--SKIPIF-- + +--INI-- +ffi.enable=1 +--FILE-- +getMessage()."\n"; +} +try { + var_dump(FFI::isNull(FFI::new("int[0]"))); +} catch (Throwable $e) { + echo get_class($e) . ": " . $e->getMessage()."\n"; +} +?> +--EXPECTF-- +bool(true) +bool(false) + +Warning: FFI::isNull() expects parameter 1 to be FFI\CData, null given in %s045.php on line %d +NULL +FFI\Exception: FFI\Cdata is not a pointer