From cb9785add1bc8031531c2870c267e6a72efae6af Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Tue, 16 Feb 2021 12:32:43 +0100 Subject: Fixed bug #80723 This fixes the issue just for the Socket class. Presumably we'll want to do the same for other "resource" objects. --- NEWS | 4 ++++ Zend/zend_object_handlers.c | 5 +++++ Zend/zend_object_handlers.h | 4 ++++ ext/sockets/sockets.c | 1 + ext/sockets/tests/bug80723.phpt | 21 +++++++++++++++++++++ 5 files changed, 35 insertions(+) create mode 100644 ext/sockets/tests/bug80723.phpt diff --git a/NEWS b/NEWS index d65fa0e8da..374f33d04d 100644 --- 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) diff --git a/Zend/zend_object_handlers.c b/Zend/zend_object_handlers.c index f091d679f6..be1631f587 100644 --- a/Zend/zend_object_handlers.c +++ b/Zend/zend_object_handlers.c @@ -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; diff --git a/Zend/zend_object_handlers.h b/Zend/zend_object_handlers.h index fedc70cc80..5134230354 100644 --- a/Zend/zend_object_handlers.h +++ b/Zend/zend_object_handlers.h @@ -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); diff --git a/ext/sockets/sockets.c b/ext/sockets/sockets.c index 6118610cac..368e61b0ed 100644 --- a/ext/sockets/sockets.c +++ b/ext/sockets/sockets.c @@ -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 index 0000000000..a05d857900 --- /dev/null +++ b/ext/sockets/tests/bug80723.phpt @@ -0,0 +1,21 @@ +--TEST-- +Bug #80723: Different sockets compare as equal (regression in 8.0) +--FILE-- + $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) -- cgit v1.2.1