curl / Mailing Lists / curl-library / Single Mail
Buy commercial curl support from WolfSSL. We help you work out your issues, debug your libcurl applications, use the API, port to new platforms, add new features and more. With a team lead by the curl founder himself.

libcurl ignore timeout on sftp disconnect

From: Estanislau Augé-Pujadas via curl-library <curl-library_at_cool.haxx.se>
Date: Wed, 20 May 2020 15:33:20 -0700

Hello!

I have been using curl to upload files with sftp, and I have encountered an
unexpected behaviour related to timeouts and disconnects. When setting
CURLOPT_TIMEOUT_MS to some value, and the network disconnects during a file
upload, libcurl does not timeout the operation.

I found a commit on Github that indicates that this behaviour is actually
intentional to address a problem that could leak to memory leaks for
libssh2 (
https://github.com/curl/curl/commit/f31760e63b4e9ef1eb25f8f211390f8239388515
).
I actually was relying on CURLOPT_TIMEOUT_MS to ensure that a task running
on a server ran for at most that time. Assuming this is intentional, is
there a
workaround or a way to mitigate this behavior, to ensure that
curl_easy_perform
ends within the specified timeout?

As an example, when running the sample code with CURLOPT_TIMEOUT_MS set to
20000ms, the task will time out and disconnect with the following output,
which
is expected, because it hits the timeout

$ time ./example
* Trying 10.0.0.1:22...
* Connected to example.com (10.0.0.1) port 22 (#0)
* SSH MD5 fingerprint: fingerprint
* SSH authentication methods available: password
* Initialized password authentication
* Authentication complete
* Operation timed out after 20000 milliseconds with 0 bytes received
* Closing connection 0
Curl error [28]
real 0m20.475s
user 0m0.118s
sys 0m0.054s

However if I run this example and disconnect the network after
"Authentication
complete", the output I get is the following (and the command ends after I
reconnect the network). In which the connection seems to hang until it can
reconnect.

$ time ./example
* Trying 10.0.0.1:22...
* Connected to example.com (10.0.0.1) port 22 (#0)
* SSH MD5 fingerprint: fingerprint
* SSH authentication methods available: password
* Initialized password authentication
* Authentication complete
* Operation timed out after 20000 milliseconds with 0 bytes received
* Closing connection 0
Curl error [28]
real 2m46.291s
user 0m0.038s
sys 0m0.033s

This is the example code I have used to isolate this specific issue. Also,
the
libcurl version is libcurl/7.71.0-DEV OpenSSL/1.1.1f zlib/1.2.11
libssh2/1.9.0,
on Ubuntu 20.04.

---
#include <stdlib.h>
#include <curl/curl.h>
int main() {
    curl_global_init(CURL_GLOBAL_ALL);
    CURL* handle = curl_easy_init();
    const char* url = "sftp://user:pass@example.com/path/filename";
    FILE *file = fopen("filename", "rb");
    curl_easy_setopt(handle, CURLOPT_PROTOCOLS, CURLPROTO_SFTP);
    curl_easy_setopt(handle, CURLOPT_TIMEOUT_MS, 20000);
    curl_easy_setopt(handle, CURLOPT_USERPWD, "user:pwd");
    curl_easy_setopt(handle, CURLOPT_URL, url);
    curl_easy_setopt(handle, CURLOPT_UPLOAD, 1L);
    curl_easy_setopt(handle, CURLOPT_READDATA, file);
    curl_easy_setopt(handle, CURLOPT_SSL_VERIFYHOST, 0);
    curl_easy_setopt(handle, CURLOPT_VERBOSE, 1);
    CURLcode code = curl_easy_perform(handle);
    if (code != 0) {
        printf("Curl error [%d]", code);
    }
    curl_easy_cleanup(handle);
    fclose(file);
    curl_global_cleanup();
    return EXIT_SUCCESS;
}
---
Any thoughts or ideas on this would be much appreciated,
Thanks!

-------------------------------------------------------------------
Unsubscribe: https://cool.haxx.se/list/listinfo/curl-library
Etiquette: https://curl.haxx.se/mail/etiquette.html
Received on 2020-05-21