php.net |  support |  documentation |  report a bug |  advanced search |  search howto |  statistics |  random bug |  login
Bug #58436 fread() fails for non-buffered streams in ssh2
Submitted: 2008-11-27 08:50 UTC Modified: 2008-12-20 12:24 UTC
From: borchinfolab at gmail dot com Assigned:
Status: Closed Package: ssh2 (PECL)
PHP Version: 5_3 CVS-2008-11-27 (dev) OS: FC9
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: borchinfolab at gmail dot com
New email:
PHP Version: OS:

 

 [2008-11-27 08:50 UTC] 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

Patches

Pull Requests

History

AllCommentsChangesGit/SVN commitsRelated reports
 [2008-12-13 12:00 UTC] helgith at gmail dot com
Reassigned to proper extension
 [2008-12-20 12:24 UTC] mikesul@php.net
Thank you for your bug report. This issue has been fixed
in the latest released version of the package, which you can download at
http://pecl.php.net/get/ssh2


 
PHP Copyright © 2001-2024 The PHP Group
All rights reserved.
Last updated: Sat Dec 21 16:01:28 2024 UTC