Bug #80723 [Csd]: Different sockets compare as equal (regression in 8.0)

From: Date: Tue, 16 Feb 2021 11:36:42 +0000
Subject: Bug #80723 [Csd]: Different sockets compare as equal (regression in 8.0)
References: 1  Groups: php.bugs 
Request: Send a blank email to php-bugs+get-232186@lists.php.net to get a copy of this message
Edit report at https://bugs.php.net/bug.php?id=80723&edit=1 ID: 80723 Updated by: nikic@php.net Reported by: bugs-a17 at moonlit-rail dot com Summary: Different sockets compare as equal (regression in 8.0) Status: Closed Type: Bug Package: Sockets related Operating System: Linux PHP Version: 8.0.2 Assigned To: nikic Block user comment: N Private report: N New Comment: The replacement for (int)$socket is spl_object_id($socket). Though we might want to add an overload for sockets in particular, as we did for curl handles. Previous Comments: ------------------------------------------------------------------------ [2021-02-16 11:34:11] nikic@php.net Automatic comment on behalf of nikita.ppv@gmail.com Revision: http://git.php.net/?p=php-src.git;a=commit;h=cb9785add1bc8031531c2870c267e6a72efae6af Log: Fixed bug #80723 ------------------------------------------------------------------------ [2021-02-08 06:24:44] bugs-a17 at moonlit-rail dot com Thanks for the note about the weak-maps, looks quite useful for many of my use cases. One workaround for this bug is to use === rather than == in the comparison. As the sockets now create a Socket class, and each instance appears empty, that might explain why <empty> == <empty> returns true; clearly, the Socket object returned by create_socket() should be populated with socket information (or at least a pointer to a resource) to permit the comparison to have something to work with. ------------------------------------------------------------------------ [2021-02-08 02:57:57] danack@php.net That probably needs to be investigated, but you may be able to use WeakMaps as a better holder for things like this: https://wiki.php.net/rfc/weak_maps which might need to be documented... ------------------------------------------------------------------------ [2021-02-08 02:44:47] bugs-a17 at moonlit-rail dot com Description: ------------ In PHP 8.0, two different sockets compare as equal. This is a regression versus PHP 7.x. I use PHP for writing internet servers, and upgrading to 8.0 sees most of them failing. Simple constructs such as, $socknum = array_search($sock, $sockets) no longer function as they intuitively ought to. As an aside, it used to be convenient to do, $array[(int)$socket] = $socket; But in 8.0, (int) $socket bombs, and var_export($socket, true) returns the same value regardless of what's in the socket. Test script: --------------- #!/usr/bin/php <?php $socket_1 = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); $socket_2 = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); $vector = array(1 => $socket_1, 2 => $socket_2); $IDX_1 = array_search($socket_1, $vector); $IDX_2 = array_search($socket_2, $vector); $V = substr(PHP_VERSION, 0, 3); echo "In PHP {$V}:\n". "\tSocket 1 was found at array index {$IDX_1}, and\n". "\tSocket 2 was found at array index {$IDX_2}.\n"; socket_close($socket_1); socket_close($socket_2); ?> Expected result: ---------------- ~$ /tmp/socket-compare-test.php In PHP 7.3: Socket 1 was found at array index 1, and Socket 2 was found at array index 2. Actual result: -------------- ~$ /tmp/socket-compare-test.php In PHP 8.0: Socket 1 was found at array index 1, and Socket 2 was found at array index 1. ------------------------------------------------------------------------ -- Edit this bug report at https://bugs.php.net/bug.php?id=80723&edit=1

« previous php.bugs (#232186) next »