]> git.ipfire.org Git - thirdparty/curl.git/commitdiff
lib: clear the easy handle's saved errno before transfer
authorJay Satiro <raysatiro@yahoo.com>
Fri, 10 May 2024 07:19:16 +0000 (03:19 -0400)
committerJay Satiro <raysatiro@yahoo.com>
Fri, 10 May 2024 22:26:32 +0000 (18:26 -0400)
- Clear data->state.os_errno before transfer.

- Explain the change in behavior in the CURLINFO_OS_ERRNO doc.

- Add to the CURLINFO_OS_ERRNO doc the list of libcurl network-related
  errors that may cause the errno to be saved.

data->state.os_errno is saved before libcurl returns a network-related
failure such as connection failure. It is accessible to the user via
CURLINFO_OS_ERRNO so they can get more information about the failure.

Prior to this change it wasn't cleared before transfer, so if a user
retrieved the saved errno it could be from a previous transfer. That is
because an errno is not always saved for network-related errors.

Closes https://github.com/curl/curl/pull/13574

docs/libcurl/opts/CURLINFO_OS_ERRNO.md
lib/easy.c
lib/multi.c

index 8f6853ef4471121d34288aace46693f15abedd1c..0b60f2892ad4fdc3a5c24abf99b1524df2385041 100644 (file)
@@ -29,6 +29,14 @@ Pass a pointer to a long to receive the errno variable from a connect failure.
 Note that the value is only set on failure, it is not reset upon a successful
 operation. The number is OS and system specific.
 
+libcurl network-related errors that may have a saved errno are:
+CURLE_COULDNT_CONNECT, CURLE_FAILED_INIT, CURLE_INTERFACE_FAILED,
+CURLE_OPERATION_TIMEDOUT, CURLE_RECV_ERROR, CURLE_SEND_ERROR.
+
+Since 8.8.0 libcurl clears the easy handle's saved errno before performing the
+transfer. Prior versions did not clear the saved errno, which means if a saved
+errno is retrieved it could be from a previous transfer on the same handle.
+
 # EXAMPLE
 
 ~~~c
index f4f4d2cc634e923a1a3bca9411180152b26b7a4d..a04dbedd87a89f4be0aa00a2592efebf2fb371a4 100644 (file)
@@ -728,6 +728,8 @@ static CURLcode easy_perform(struct Curl_easy *data, bool events)
     /* clear this as early as possible */
     data->set.errorbuffer[0] = 0;
 
+  data->state.os_errno = 0;
+
   if(data->multi) {
     failf(data, "easy handle already used in multi handle");
     return CURLE_FAILED_INIT;
index 13d62555120f70de494c73b9af3ee4ab307c98b2..2a4a09dae30033e3299bf62b7bbad6e8e8fd0f14 100644 (file)
@@ -552,6 +552,8 @@ CURLMcode curl_multi_add_handle(struct Curl_multi *multi,
   if(data->set.errorbuffer)
     data->set.errorbuffer[0] = 0;
 
+  data->state.os_errno = 0;
+
   /* make the Curl_easy refer back to this multi handle - before Curl_expire()
      is called. */
   data->multi = multi;