At the head of _libssh2_channel_read(), a while loop calls 
_libssh2_transport_read(), after this comment:

>       Process all pending incoming packets in all states in order to "even 
> out" the network readings. Tests prove that this way produces faster 
> transfers.


That makes sense for file transfers where the server will wait for an 
acknowledgement, but in the case of a terminal session that's firehosing data 
at us faster than we can process, that winds up filling up all available 
memory--instead of just the network buffer. I changed that code to

        read_packet = _libssh2_list_first(&session->packets);

        while ( read_packet == NULL && rc > 0 )
        {
                rc = _libssh2_transport_read(session);
                read_packet = _libssh2_list_first(&session->packets);
        }

and it appears to fix this problem. Maybe there should be a channel or session 
setting, choosing between the two? Or a limit on the number of packets the 
session will buffer?

Thanks!
-Dave


_______________________________________________
libssh2-devel http://cool.haxx.se/cgi-bin/mailman/listinfo/libssh2-devel

Reply via email to