php.net |  support |  documentation |  report a bug |  advanced search |  search howto |  statistics |  random bug |  login
Bug #44955 socket array keys not working as expected
Submitted: 2008-05-09 14:58 UTC Modified: 2008-07-15 11:22 UTC
Votes:3
Avg. Score:5.0 ± 0.0
Reproduced:2 of 2 (100.0%)
Same Version:2 (100.0%)
Same OS:2 (100.0%)
From: fidojones at fidojones dot com Assigned: felipe (profile)
Status: Closed Package: Sockets related
PHP Version: 5.2.6 OS: Linux
Private report: No CVE-ID: None
Welcome back! If you're the original bug submitter, here's where you can edit the bug or add additional notes.
If you forgot your password, you can retrieve your password here.
Password:
Status:
Package:
Bug Type:
Summary:
From: fidojones at fidojones dot com
New email:
PHP Version: OS:

 

 [2008-05-09 14:58 UTC] fidojones at fidojones dot com
Description:
------------
This bugfixed 

http://bugs.php.net/bug.php?id=44197

make work socket arrays some strange. 

I think that some HASH_KEY is not contemplate in switch case line 605

switch (zend_hash_get_current_key_ex(Z_ARRVAL_P(sock_array), &key, &key_len, &num_key, 0, NULL)) {

Nanoweb server http://nanoweb.si.kz/, when try to access it, eat cpu at 99% time with this socket patch.


Reproduce code:
---------------
<?php
$ary = array();
$strone = 'Message From Parent.';
$strtwo = 'Message From Child.';
if (socket_create_pair(AF_UNIX, SOCK_STREAM, 0, $ary) === false) {
    echo "socket_create_pair() failed. Reason: ".socket_strerror(socket_last_error());
}
$pid = pcntl_fork();
if ($pid == -1) {
    echo 'Could not fork Process.';
} elseif ($pid) {
    /*parent*/
    socket_close($ary[0]);
    if (socket_write($ary[1], $strone, strlen($strone)) === false) {
        echo "socket_write() failed. Reason: ".socket_strerror(socket_last_error($ary[1]));
    }
    if (socket_read($ary[1], strlen($strtwo), PHP_BINARY_READ) == $strtwo) {
        echo "Recieved $strtwo\n";
    }
    socket_close($ary[1]);
} else {
    /*child*/
    socket_close($ary[1]);
    if (socket_write($ary[0], $strtwo, strlen($strtwo)) === false) {
        echo "socket_write() failed. Reason: ".socket_strerror(socket_last_error($ary[0]));
    }
    if (socket_read($ary[0], strlen($strone), PHP_BINARY_READ) == $strone) {
        echo "Recieved $strone\n";
    }
    socket_close($ary[0]);
}
?>

Expected result:
----------------
php 5.2.5 result:

bash$ php socket.php 
Recieved Message From Child.
Recieved Message From Parent.


Actual result:
--------------
php 5.2.6 result:

bash# php socket.php 
Recieved Message From Child.
bash# Recieved Message From Parent.

An here wait and you should hit return to see the bash prompt again


Patches

Pull Requests

History

AllCommentsChangesGit/SVN commitsRelated reports
 [2008-05-09 16:27 UTC] jani@php.net
Assigned to Felipe who broke this.
 [2008-05-09 17:50 UTC] felipe@php.net
The problem isn't related with the patch... It just fixed a problem in socket_select(). Your script doesn't use it.
 [2008-05-09 18:12 UTC] fidojones at fidojones dot com
I'm using the socket.c file in ext/socket/ from php 5.2.5 in php 5.2.6 and all is working fine. And the only diff in socket.c is the patch http://bugs.php.net/bug.php?id=44197 ,so explain me if not related with this patch, why is working perfect? if I only overwrite the socket.c file...

You should test the script and say me if you see the execution diference and I encourage to try http://nanoweb.si.kz/ that has been working with all php versions from 4 to 5.2.5 and only fails with php 5.2.6.
 [2008-07-14 21:29 UTC] jani@php.net
Felipe, you break -> you fix. Or revert the patch you applied that obviously causes the problem.
 [2008-07-14 21:45 UTC] fidojones at fidojones dot com
Aparently socket_select acts completely diferent as past versions. Nanoweb server has been fixed to work with this versions:

old version in nanoweb before 5.2.6:

$ns=socket_select($lnset, $write=NULL, $except=NULL, 1);
if ($ns) {	
 if ($lnset[0]==$children_sck) {

new version in nanoweb from 5.2.6:

$ns=socket_select($lnset, $write=NULL, $except=NULL, 1);
if ($ns) foreach ($lnset as $lnact) {
  if ($lnact==$children_sck) {

So I think it's not a bug, but acts different as older versions.
 [2008-07-15 06:44 UTC] derick@php.net
Changes in behavior in minor versions are bugs.
 [2008-07-15 11:22 UTC] felipe@php.net
Ok, sorry!

Thanks fidojones for the feedbacks.
 
PHP Copyright © 2001-2024 The PHP Group
All rights reserved.
Last updated: Sat Dec 21 18:01:29 2024 UTC