[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> | 

