On Thu, 9 Aug 2007, Daniel Stenberg wrote: > Me too, and I'll offer what I've learned so far (no fix yet but I'll continue > tomorrow): > > src/transport.c:311 > > This is wrong. It checks if amount of already read data is less than > 'minimum' and if so it reads more. In my case, I can get it to reach there > in the middle of a transfer with 'remainbuf' to be 4 and 'minimum' to be 4 > as well. (Thus, the following block is not executed.)
Ok friends, I'll need some help and eyes on this. As I mentioned above, the check is bad and the patch below[1] is what I think will rectify this. Do note that this is almost a revertion of the src/transport.c 1.6 commit by me: "Eberhard Mattes' fix for libssh2_packet_read() for when reading very small chunks at a time.". But... with this applied I still get a hang repeatedly! That flaw was not the only one lurking. This second hang (busy-loop) occurs when select() in scp_nonblock.c returns 1 because the socket is *writeable* but not readable (I edited the example somewhat to give me this info). It will then make the loop continue to libssh2_channel_read() which will returns swiftly with LIBSSH2_ERROR_EAGAIN since it couldn't recv() anything from the socket and back to select() again that returns 1... Why on earth does it suddenly turn writable? It seems to have at various times but I've not yet managed to get scp_nonblock to copy my 85MB test file over localhost! ;-O Anyway, I'll sleep on it now but if you have any input or suggestions, please speak up! [1] = --- src/transport.c 6 Aug 2007 20:48:07 -0000 1.10 +++ src/transport.c 9 Aug 2007 21:42:54 -0000 @@ -267,7 +267,6 @@ int numdecrypt; unsigned char block[MAX_BLOCKSIZE]; int blocksize; - int minimum; int encrypted = 1; /* @@ -293,7 +292,6 @@ blocksize = 5; /* not strictly true, but we can use 5 here to make the checks below work fine still */ } - minimum = p->total_num ? p->total_num - p->data_num : blocksize; /* read/use a whole big chunk into a temporary area stored in the LIBSSH2_SESSION struct. We will decrypt data from that @@ -308,8 +306,8 @@ /* if remainbuf turns negative we have a bad internal error */ assert(remainbuf >= 0); - if (remainbuf < minimum) { - /* If we have less than a minimum left, it is too + if (remainbuf < blocksize) { + /* If we have less than a blocksize left, it is too little data to deal with, read more */ ssize_t nread; ------------------------------------------------------------------------- This SF.net email is sponsored by: Splunk Inc. Still grepping through log files to find problems? Stop. Now Search log events and configuration files using AJAX and a browser. Download your FREE copy of Splunk now >> http://get.splunk.com/ _______________________________________________ libssh2-devel mailing list libssh2-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/libssh2-devel