]> granicus.if.org Git - php/commitdiff
NEWS entry, test and minor cleanup for FFI::isNull()
authorDmitry Stogov <dmitry@zend.com>
Tue, 10 Sep 2019 08:23:12 +0000 (11:23 +0300)
committerDmitry Stogov <dmitry@zend.com>
Tue, 10 Sep 2019 08:23:12 +0000 (11:23 +0300)
NEWS
ext/ffi/ffi.c
ext/ffi/tests/045.phpt [new file with mode: 0644]

diff --git a/NEWS b/NEWS
index 695ec84407fbeca0c5407415bb572f4ed6317b56..9563d6c3681de4739c0d66f865f137ac53efe436 100644 (file)
--- 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:
index 83838ae6a164c4ff4cf5846be0b53a3d505ffbf5..1d6f84b6b2234c60fac5582d2dcf6fa7ab401676 100644 (file)
@@ -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 (file)
index 0000000..7118df9
--- /dev/null
@@ -0,0 +1,29 @@
+--TEST--
+FFI 045: FFI::isNull()
+--SKIPIF--
+<?php require_once('skipif.inc'); ?>
+--INI--
+ffi.enable=1
+--FILE--
+<?php
+var_dump(FFI::isNull(FFI::new("int*")));
+$i = FFI::new("int");
+var_dump(FFI::isNull(FFI::addr($i)));
+try {
+       var_dump(FFI::isNull(null));
+} catch (Throwable $e) {
+       echo get_class($e) . ": " . $e->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