<pre style='margin:0'>
Clemens Lang (neverpanic) pushed a commit to branch master
in repository macports-base.

</pre>
<p><a href="https://github.com/macports/macports-base/commit/f535c26af9e12302c7eb316c8aab1aa5f2d149d9">https://github.com/macports/macports-base/commit/f535c26af9e12302c7eb316c8aab1aa5f2d149d9</a></p>
<pre style="white-space: pre; background: #F8F8F8"><span style='display:block; white-space:pre;color:#808000;'>commit f535c26af9e12302c7eb316c8aab1aa5f2d149d9
</span>Author: Clemens Lang <cal@macports.org>
AuthorDate: Fri Jun 12 17:01:51 2020 +0200

<span style='display:block; white-space:pre;color:#404040;'>    pextlib1.0: init err buffer, use err code if empty
</span><span style='display:block; white-space:pre;color:#404040;'>    
</span><span style='display:block; white-space:pre;color:#404040;'>    curl < 7.60.0 does not initialize the error buffer, and cases have been
</span><span style='display:block; white-space:pre;color:#404040;'>    reported where a curl download failed without the error buffer being
</span><span style='display:block; white-space:pre;color:#404040;'>    set. This was the case on older systems that did not yet have curl
</span><span style='display:block; white-space:pre;color:#404040;'>    7.60.0, and caused random garbage to be printed.
</span><span style='display:block; white-space:pre;color:#404040;'>    
</span><span style='display:block; white-space:pre;color:#404040;'>    0-initialize the buffer and check whether the buffer has a useful
</span><span style='display:block; white-space:pre;color:#404040;'>    message before returning it. Generate a substitute message using
</span><span style='display:block; white-space:pre;color:#404040;'>    curl_easy_strerror() from the returned error code if the error buffer is
</span><span style='display:block; white-space:pre;color:#404040;'>    not set.
</span><span style='display:block; white-space:pre;color:#404040;'>    
</span><span style='display:block; white-space:pre;color:#404040;'>    Closes: https://trac.macports.org/ticket/60581
</span>---
 src/pextlib1.0/curl.c | 22 ++++++++++++++++++++--
 1 file changed, 20 insertions(+), 2 deletions(-)

<span style='display:block; white-space:pre;color:#808080;'>diff --git a/src/pextlib1.0/curl.c b/src/pextlib1.0/curl.c
</span><span style='display:block; white-space:pre;color:#808080;'>index 4ece1e9d..a49d30d1 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/src/pextlib1.0/curl.c
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/src/pextlib1.0/curl.c
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -170,6 +170,11 @@ CurlFetchCmd(Tcl_Interp* interp, int objc, Tcl_Obj* CONST objv[])
</span>   FILE* theFile = NULL;
        char theErrorString[CURL_ERROR_SIZE];
 
<span style='display:block; white-space:pre;background:#e0ffe0;'>+        /* Always 0-initialize the error string, since older curl versions may not
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    * initialize the error string buffer at all. See
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    * https://trac.macports.org/ticket/60581. */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   theErrorString[0] = '\0';
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span>   do {
                int noprogress = 1;
                int useepsv = 1;
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -645,8 +650,21 @@ CurlFetchCmd(Tcl_Interp* interp, int objc, Tcl_Obj* CONST objv[])
</span>           }
                
                if (info->data.result != CURLE_OK) {
<span style='display:block; white-space:pre;background:#ffe0e0;'>-                        /* execution failed, use the error string */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                   Tcl_SetResult(interp, theErrorString, TCL_VOLATILE);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                   /* execution failed, use the error string if it is set */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                   if (theErrorString[0] != '\0') {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                           Tcl_SetResult(interp, theErrorString, TCL_VOLATILE);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                   } else {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                           /* When the error buffer does not hold useful information,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                            * generate our own message. Use a larger buffer since we add
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                            * a significant amount of text. */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                           char errbuf[256 + CURL_ERROR_SIZE];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                           snprintf(errbuf, sizeof(errbuf),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                                   "curl_multi_info_read() returned {.msg = CURLMSG_DONE, "
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                                   ".data.result = %d (!= CURLE_OK)}, but the error buffer "
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                                   "is not set. curl_easy_strerror(.data.result): %s",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                                   info->data.result, curl_easy_strerror(info->data.result));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                           Tcl_SetResult(interp, errbuf, TCL_VOLATILE);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                   }
</span>                   theResult = TCL_ERROR;
                        break;
                }
</pre><pre style='margin:0'>

</pre>