[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Library blocks in call to poll
[Thread Prev] | [Thread Next]
- Subject: Library blocks in call to poll
- From: Joao Pedro Almeida Pereira <joao.almeida@xxxxxxxxxxx>
- Reply-to: libssh@xxxxxxxxxx
- Date: Thu, 31 Jul 2014 15:55:26 +0200
- To: libssh <libssh@xxxxxxxxxx>
Hello, I am seeing a behaviour in the library that is strange and due to a return value that is not being retrieved. The behaviour is the following 1 - Create a shell channel 2 - write and read a bunch of commands 3 - Wait 10 minutes without traffic 4 - Try to disconnect the channel 4 - Read the output but the output is an EOF and the channel closes 5 - After that the poll is called to flush the rest of the packets from the socket and will never leave this function because we get a Broken Pipe in the connection I am using linux and the library version 0.6.3 This is the log of the library: [2014/07/31 11:06:16.326721, 3] ssh_socket_unbuffered_write: Enabling POLLOUT for socket [2014/07/31 11:06:16.326741, 3] packet_send2: packet: wrote [len=12,padding=6,comp=5,payload=5] [2014/07/31 11:06:16.326750, 3] ssh_channel_send_eof: Sent a EOF on client channel (43:0) [2014/07/31 11:06:16.326770, 3] packet_send2: packet: wrote [len=12,padding=6,comp=5,payload=5] [2014/07/31 11:06:16.326779, 3] ssh_channel_close: Sent a close on client channel (43:0) [2014/07/31 11:06:16.326806, 3] ssh_packet_socket_callback: packet: read type 96 [len=12,padding=6,comp=5,payload=5] [2014/07/31 11:06:16.326816, 3] ssh_packet_process: Dispatching handler for packet type 96 [2014/07/31 11:06:16.326827, 3] channel_rcv_eof: Received eof on channel (44:1) [2014/07/31 11:06:16.326835, 3] ssh_packet_socket_callback: Processing 244 bytes left in socket buffer [2014/07/31 11:06:16.326850, 3] ssh_packet_socket_callback: packet: read type 98 [len=44,padding=5,comp=38,payload=38] [2014/07/31 11:06:16.326858, 3] ssh_packet_process: Dispatching handler for packet type 98 [2014/07/31 11:06:16.326870, 3] channel_rcv_request: Remote connection closed by signal SIG TERM [2014/07/31 11:06:16.326878, 3] ssh_packet_socket_callback: Processing 176 bytes left in socket buffer [2014/07/31 11:06:16.326891, 3] ssh_packet_socket_callback: packet: read type 97 [len=12,padding=6,comp=5,payload=5] [2014/07/31 11:06:16.326899, 3] ssh_packet_process: Dispatching handler for packet type 97 [2014/07/31 11:06:16.326907, 3] channel_rcv_close: Received close on channel (44:1) [2014/07/31 11:06:16.326914, 3] ssh_packet_socket_callback: Processing 140 bytes left in socket buffer [2014/07/31 11:06:16.326927, 3] ssh_packet_socket_callback: packet: read type 96 [len=12,padding=6,comp=5,payload=5] [2014/07/31 11:06:16.326935, 3] ssh_packet_process: Dispatching handler for packet type 96 [2014/07/31 11:06:16.326943, 3] channel_rcv_eof: Received eof on channel (43:0) [2014/07/31 11:06:16.326950, 3] ssh_packet_socket_callback: Processing 104 bytes left in socket buffer [2014/07/31 11:06:16.326963, 3] ssh_packet_socket_callback: packet: read type 98 [len=44,padding=5,comp=38,payload=38] [2014/07/31 11:06:16.326971, 3] ssh_packet_process: Dispatching handler for packet type 98 [2014/07/31 11:06:16.326980, 3] channel_rcv_request: Remote connection closed by signal SIG TERM [2014/07/31 11:06:16.326988, 3] ssh_packet_socket_callback: Processing 36 bytes left in socket buffer [2014/07/31 11:06:16.327001, 3] ssh_packet_socket_callback: packet: read type 97 [len=12,padding=6,comp=5,payload=5] [2014/07/31 11:06:16.327009, 3] ssh_packet_process: Dispatching handler for packet type 97 [2014/07/31 11:06:16.327016, 3] channel_rcv_close: Received close on channel (43:0) [2014/07/31 11:06:16.327044, 3] ssh_socket_unbuffered_write: Enabling POLLOUT for socket [2014/07/31 11:06:16.327066, 1] ssh_socket_nonblocking_flush: Writing packet: error on socket (or connection closed): Broken pipe This is the library back trace: #0 0x00007ff8e99cc4bf in poll () from /lib64/libc.so.6 #1 0x00007ff8e426fceb in ssh_poll_ctx_dopoll () from /usr/lib64/libssh.so.4 #2 0x00007ff8e4270121 in ssh_handle_packets () from /usr/lib64/libssh.so.4 #3 0x00007ff8e427038a in ssh_handle_packets_termination () from /usr/lib64/libssh.so.4 #4 0x00007ff8e427051a in ssh_blocking_flush () from /usr/lib64/libssh.so.4 #5 0x00007ff8e425e476 in ssh_channel_close () from /usr/lib64/libssh.so.4 The problem that i found is that the function ssh_socket_nonblocking_flush when is called the library do not check if an error happened and follow the stream without looking into it an so when the poll is done in the socket it gets stuck. To solve the following issue i created the attached patch that correct some points present in the socket.c that had "FIXME" tags on them, and now the problem is solved. If you see any issue please tell me. BR -- ----- -------- João Pereira Email: joao.almeida@xxxxxxxxxxx Web: http://www.bluetc.es
Attachment:
0001-Sending-EOF-on-Socket-that-received-a-Broken-Pipe-ma.patch
Description: Binary data
Archive administrator: postmaster@lists.cynapses.org