Hello, I found that in some cases 'ssh_poll_ctx_dopoll' procedure from 'poll.c' (libssh 0.9.0) returns 1 instead of a valid SSH_{OK,ERROR,AGAIN} code. This seems to be wrong according to the commentary written above the procedure.
My application (Guile-SSH) fails approximately 4 out of 5 times due to this libssh behavior as I do 'assert (0)' on the cases when 'ssh_channel_open_forward' returns unknown value (1, in my case.) I'm investigating the problem and it seems that there are situations when 'ssh_poll' returns 1 as the result, and 'used = ctx->polls_used' yields to zero, so this loop[1] never executes and thus 'rc' value never decreases to zero: --8<---------------cut here---------------start------------->8--- for (i = 0; i < used && rc > 0; ) { if (!ctx->pollfds[i].revents || ctx->pollptrs[i]->lock) { i++; } else { // ... skipped ... rc--; } } --8<---------------cut here---------------end--------------->8--- In such case, the procedure returns 1. I observe the same problem on the 'master' branch (c6460cc9). I can prepare a patch when I figure out what is the right solution for this. Any help with that would be appreciated. Thanks! - Artyom [1] https://git.libssh.org/projects/libssh.git/tree/src/poll.c?h=libssh-0.9.0#n690 -- Artyom V. Poptsov <poptsov.art...@gmail.com> Home page: http://poptsov-artyom.narod.ru/ CADR Hackerspace co-founder: https://cadrspace.ru/ GPG: D0C2 EAC1 3310 822D 98DE B57C E9C5 A2D9 0898 A02F
smime.p7s
Description: S/MIME cryptographic signature