[PECL-BUG] Bug #15175 [NEW]: fread() fails for non-buffered streams in ssh2

[email protected] ("borchinfolab at gmail dot com")
Newsgroups php.pear.webmaster
Message-ID <[email protected]>
From:             borchinfolab at gmail dot com
Operating system: FC9
Package version:  
PHP version:      5_3 CVS-2008-11-27 (dev)
Package:          Bug System
Bug Type:         Bug
Bug description:  fread() fails for non-buffered streams in ssh2

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 bug report at http://pecl.php.net/bugs/bug.php?id=15175&edit=1
--
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.