[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
AW: sftp_write waits infinitely
[Thread Prev] | [Thread Next]
- Subject: AW: sftp_write waits infinitely
- From: Jakob Kohl | nowcast GmbH <jkohl@xxxxxxxxxx>
- Reply-to: libssh@xxxxxxxxxx
- Date: Wed, 17 Feb 2016 15:00:20 +0000
- To: "libssh@xxxxxxxxxx" <libssh@xxxxxxxxxx>
Hello,
some more information.
I am using libssh 0.6.1 from ubuntu trusty.
The program's call stack when it waits infinitely:
0 __poll_nocancel syscall-template.S 81 0x7ffff6063110
1 ssh_poll_ctx_dopoll poll.c 604 0x7ffff5503479
2 ssh_handle_packets session.c 547 0x7ffff5504339
3 ssh_handle_packets_termination session.c 609 0x7ffff550441d
4 ssh_channel_read_timeout channels.c 2801 0x7ffff54f10d2
5 ssh_channel_read channels.c 2717 0x7ffff54f11db
6 sftp_packet_read sftp.c 329 0x7ffff550a958
7 sftp_read_and_dispatch sftp.c 468 0x7ffff550ace0
8 sftp_write sftp.c 2006 0x7ffff550d168
9 ...
I do not understand this function, that is also part of my call stack:
int ssh_channel_read(ssh_channel channel, void *dest, uint32_t count, int is_stderr)
{
return ssh_channel_read_timeout(channel, dest, count, is_stderr, -1);
}
So ssh_channel_read_timeout is always called with timeout=-1
Is this function we find:
if (timeout < 0) {
timeout = SSH_TIMEOUT_DEFAULT;
}
rc = ssh_handle_packets_termination(session,
timeout,
ssh_channel_read_termination,
&ctx);
So ssh_handle_packets_termination is always called with timeout=SSH_TIMEOUT_DEFAULT.
In this function there is:
if (timeout == SSH_TIMEOUT_USER) {
...
} else if (timeout == SSH_TIMEOUT_DEFAULT) {
if (ssh_is_blocking(session)) {
timeout = SSH_TIMEOUT_INFINITE;
} else {
timeout = SSH_TIMEOUT_NONBLOCKING;
}
}
It will never run into the SSH_TIMEOUT_USER case but always use the SSH_TIMEOUT_INFINITE for nonblocking or SSH_TIMEOUT_NONBLOCKING which is 0. Is this a bug?
What part of the library really uses the timeout set with ssh_options_set(sshSession, SSH_OPTIONS_TIMEOUT, &timeout)?
Any help will be appreciated.
Best regards
Jakob Kohl
________________________________
Von: Jakob Kohl | nowcast GmbH <jkohl@xxxxxxxxxx>
Gesendet: Mittwoch, 17. Februar 2016 11:21
An: libssh@xxxxxxxxxx
Betreff: sftp_write waits infinitely
Hello,
I am having a problem with sftp transfer. I have the following test setup:
1. A machine which accepts ssh connections.
2. My machine which sets up connection to the first machine and transmits a large file.
During the transmission of the file I unplug the network cable of machine 1. Program on my machine waits somewhere in sftp_write.
After 20 minutes or so I plug the network cable. Program still waits in sftp_write and will do this forever!
I debugged into this problem and noticed that ssh_channel_read_timeout is called with timeout = -1, which means infinite timeout.
I am using the default blocking ssh_session and sftp_file.
I am also using this:
int timeout = 10;
ssh_options_set(sshSession, SSH_OPTIONS_TIMEOUT, &timeout);
Setting the sftp file to nonblocking changes nothing as the nonblocking flag is only used for sftp file read.
When using ssh_set_blocking(sshSession, 0) even connecting the ssh session won't work!
So how do I implement a SFTP file transfer, which runs into a timeout of 10 seconds if connection is lost and then returns?
Best regards
Jakob Kohl
Software Entwicklung
[nowcast GmbH]
nowcast GmbH
Albert-Roßhaupter-Str. 43
81369 München
Phone: +49.(0)89.5529.713.85
Fax: +49.(0)89.5529.713.71
jakob.kohl@xxxxxxxxxx<mailto:jakob.kohl@xxxxxxxxxx>
www.nowcast.de<http://www.nowcast.de>
Geschäftsführung / Management Board: Alexander Betz, Irmtraud Königshofer
Sitz der Gesellschaft / Registered Office: München
Registergericht / Court of Registration: AG München, HRB 147454
USt.-Id: DE 233256369
| Re: sftp_write waits infinitely | Andreas Schneider <asn@xxxxxxxxxxxxxx> |
| sftp_write waits infinitely | Jakob Kohl | nowcast GmbH <jkohl@xxxxxxxxxx> |