ID: 46697 User updated by: borchinfolab at gmail dot com Reported By: borchinfolab at gmail dot com -Status: Open +Status: Closed Bug Type: Reproducible crash Operating System: FC9 PHP Version: 5.3CVS-2008-11-27 (snap) New Comment:
Sorry, this one was for pecl... Ignore this one Previous Comments: ------------------------------------------------------------------------ [2008-11-27 13:39:51] borchinfolab at gmail dot com Description: ------------ When doing fread() from a ssh2 stream in unbuffered mode the program core dumps. I believe the reason for this is ether a problem with fread() or a problem in php_ssh2_channel_stream_read(). I guess the reason for the crash is that libssh2_channel_read_ex() in libssh2 returns -37 when the buffer is empty - this is handed over to fread() where I guess it expects a positive integer. I made a small test in php_ssh2_channel_stream_read() to see if this is the case: static size_t php_ssh2_channel_stream_read(php_stream *stream, char *buf, size_t count TSRMLS_DC) { php_ssh2_channel_data *abstract = (php_ssh2_channel_data*)stream->abstract; stream->eof = libssh2_channel_eof(abstract->channel); libssh2_channel_set_blocking(abstract->channel, abstract->is_blocking); int res = libssh2_channel_read_ex(abstract->channel, abstract->streamid, buf, count); return(res < 0 ? 0 : res); } This fixed the problem for me. Perhaps the correct return value should be EOF? Also ssh2 does not compile for php-5.3 (this has been reported in an other bug report) - managed to fix this by replacing statements with correct macros. I guess the fix will work for php-5.2.* as well, but there has been corrections in stream_set_blocking() so it might not work after all. This problem has been reported to php.net as well. Reproduce code: --------------- #!/usr/bin/php <?php $connection = ssh2_connect(HOSTNAME, 22, array('hostkey'=>'ssh-rsa')); if(ssh2_auth_pubkey_file($connection, USERNAME, ID_RSA_PUB, ID_RSA, '')) { $stream = ssh2_exec($connection, "ps -elf"); // stream_set_blocking($stream, false); THIS DOSN'T WORK stream_set_blocking($stream, true); // THIS WORKS while(!feof($stream)) { $buf = fread($stream, 1024); echo ">$buf\n"; } } ?> Expected result: ---------------- Output from ps -elf Actual result: -------------- Core dump ------------------------------------------------------------------------ -- Edit this bug report at http://bugs.php.net/?id=46697&edit=1