php.net |  support |  documentation |  report a bug |  advanced search |  search howto |  statistics |  random bug |  login
Bug #46697 fread() fails for non-buffered streams in ssh2
Submitted: 2008-11-27 13:39 UTC Modified: 2008-11-27 13:45 UTC
From: borchinfolab at gmail dot com Assigned:
Status: Closed Package: Reproducible crash
PHP Version: 5.3CVS-2008-11-27 (snap) 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 13:39 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-11-27 13:45 UTC] borchinfolab at gmail dot com
Sorry, this one was for pecl...

Ignore this one
 
PHP Copyright © 2001-2025 The PHP Group
All rights reserved.
Last updated: Thu Jul 03 12:01:33 2025 UTC