]> granicus.if.org Git - php/commitdiff
Fixed bug #80723
authorNikita Popov <nikita.ppv@gmail.com>
Tue, 16 Feb 2021 11:32:43 +0000 (12:32 +0100)
committerNikita Popov <nikita.ppv@gmail.com>
Tue, 16 Feb 2021 11:33:50 +0000 (12:33 +0100)
This fixes the issue just for the Socket class. Presumably we'll
want to do the same for other "resource" objects.

NEWS
Zend/zend_object_handlers.c
Zend/zend_object_handlers.h
ext/sockets/sockets.c
ext/sockets/tests/bug80723.phpt [new file with mode: 0644]

diff --git a/NEWS b/NEWS
index d65fa0e8da4a74ff741b4ebda632d72f432b18c3..374f33d04dd7578827cceb81f65a32b910ab6351 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -35,6 +35,10 @@ PHP                                                                        NEWS
   . Fixed bug #70091 (Phar does not mark UTF-8 filenames in ZIP archives). (cmb)
   . Fixed bug #53467 (Phar cannot compress large archives). (cmb, lserni)
 
+- Socket:
+  . Fixed bug #80723 (Different sockets compare as equal (regression in 8.0)).
+    (Nikita)
+
 - SPL:
   . Fixed bug#80719 (Iterating after failed ArrayObject::setIteratorClass()
     causes Segmentation fault). (Nikita)
index f091d679f681b98af8fa368e4553db10a4320eaf..be1631f587392183c7748388d6f54929d3b940a5 100644 (file)
@@ -1608,6 +1608,11 @@ ZEND_API int zend_std_compare_objects(zval *o1, zval *o2) /* {{{ */
 }
 /* }}} */
 
+ZEND_API int zend_objects_not_comparable(zval *o1, zval *o2)
+{
+       return ZEND_UNCOMPARABLE;
+}
+
 ZEND_API int zend_std_has_property(zend_object *zobj, zend_string *name, int has_set_exists, void **cache_slot) /* {{{ */
 {
        int result;
index fedc70cc8099727da57e7dab7ab5469d17ad0b37..513423035488d078a76b59732fceffe55cafeb72 100644 (file)
@@ -213,6 +213,10 @@ ZEND_API int zend_std_compare_objects(zval *o1, zval *o2);
 ZEND_API int zend_std_get_closure(zend_object *obj, zend_class_entry **ce_ptr, zend_function **fptr_ptr, zend_object **obj_ptr, zend_bool check_only);
 ZEND_API void rebuild_object_properties(zend_object *zobj);
 
+/* Handler for objects that cannot be meaningfully compared.
+ * Only objects with the same identity will be considered equal. */
+ZEND_API int zend_objects_not_comparable(zval *o1, zval *o2);
+
 ZEND_API int zend_check_protected(zend_class_entry *ce, zend_class_entry *scope);
 
 ZEND_API int zend_check_property_access(zend_object *zobj, zend_string *prop_info_name, zend_bool is_dynamic);
index 6118610cac3dba1f1c882aa729e0b864eae2ad45..368e61b0ed56427e88e6b6ad79c235af14ab5edc 100644 (file)
@@ -446,6 +446,7 @@ static PHP_MINIT_FUNCTION(sockets)
        socket_object_handlers.get_constructor = socket_get_constructor;
        socket_object_handlers.clone_obj = NULL;
        socket_object_handlers.get_gc = socket_get_gc;
+       socket_object_handlers.compare = zend_objects_not_comparable;
 
        zend_class_entry ce_address_info;
        INIT_CLASS_ENTRY(ce_address_info, "AddressInfo", class_AddressInfo_methods);
diff --git a/ext/sockets/tests/bug80723.phpt b/ext/sockets/tests/bug80723.phpt
new file mode 100644 (file)
index 0000000..a05d857
--- /dev/null
@@ -0,0 +1,21 @@
+--TEST--
+Bug #80723: Different sockets compare as equal (regression in 8.0)
+--FILE--
+<?php
+$socket_1 = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
+$socket_2 = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
+var_dump($socket_1 == $socket_1);
+var_dump($socket_2 == $socket_2);
+var_dump($socket_1 == $socket_2);
+
+$vector = array(1 => $socket_1, 2 => $socket_2);
+var_dump(array_search($socket_1, $vector));
+var_dump(array_search($socket_2, $vector));
+
+?>
+--EXPECT--
+bool(true)
+bool(true)
+bool(false)
+int(1)
+int(2)