bug76839.phpt 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. --TEST--
  2. Bug #76839: socket_recvfrom may return an invalid 'from' address on MacOS
  3. --EXTENSIONS--
  4. sockets
  5. --SKIPIF--
  6. <?php
  7. if (strtolower(substr(PHP_OS, 0, 3)) === 'win') {
  8. die('skip not valid for Windows.');
  9. }
  10. --FILE--
  11. <?php
  12. // This bug only occurs when a specific portion of memory is unclean.
  13. // Unfortunately, looping around 10 times and using random paths is the
  14. // best way I could manage to reproduce this problem without modifying php itself :-/
  15. for ($i = 0; $i < 10; $i++) {
  16. $senderSocketPath = '/tmp/' . substr(md5(rand()), 0, rand(8, 16)) . '.sock';
  17. $senderSocket = socket_create(AF_UNIX, SOCK_DGRAM, 0);
  18. socket_bind($senderSocket, $senderSocketPath);
  19. $receiverSocketPath = '/tmp/' . substr(md5(rand()), 0, rand(8, 16)) . '.sock';
  20. $receiverSocket = socket_create(AF_UNIX, SOCK_DGRAM, 0);
  21. socket_bind($receiverSocket, $receiverSocketPath);
  22. // Send message from sender socket to receiver socket
  23. socket_sendto($senderSocket, 'Ping!', 5, 0, $receiverSocketPath);
  24. // Receive message on receiver socket
  25. $from = '';
  26. $message = '';
  27. socket_recvfrom($receiverSocket, $message, 65535, 0, $from);
  28. echo "Received '$message'\n";
  29. // Respond to the sender using the 'from' address from socket_recvfrom
  30. socket_sendto($receiverSocket, 'Pong!', 5, 0, $from);
  31. echo "Responded to sender with 'Pong!'\n";
  32. socket_close($receiverSocket);
  33. unlink($receiverSocketPath);
  34. socket_close($senderSocket);
  35. unlink($senderSocketPath);
  36. }
  37. ?>
  38. --EXPECT--
  39. Received 'Ping!'
  40. Responded to sender with 'Pong!'
  41. Received 'Ping!'
  42. Responded to sender with 'Pong!'
  43. Received 'Ping!'
  44. Responded to sender with 'Pong!'
  45. Received 'Ping!'
  46. Responded to sender with 'Pong!'
  47. Received 'Ping!'
  48. Responded to sender with 'Pong!'
  49. Received 'Ping!'
  50. Responded to sender with 'Pong!'
  51. Received 'Ping!'
  52. Responded to sender with 'Pong!'
  53. Received 'Ping!'
  54. Responded to sender with 'Pong!'
  55. Received 'Ping!'
  56. Responded to sender with 'Pong!'
  57. Received 'Ping!'
  58. Responded to sender with 'Pong!'