Re: error: git-remote-https died of signal 13

From
Jeff King <hidden>
Date
2016-06-15 22:59:19
Reply to
Stefan Beller, 2016-06-15
[+cc Daniel, who worked on the curl fix]

On Sun, Nov 24, 2013 at 04:01:43PM +0100, Stefan Beller wrote:
On 24.11.2013 14:33, Jeff King wrote:
quoted
On Sun, Nov 24, 2013 at 01:54:34PM +0100, Stefan Beller wrote:
quoted
Here is the output of 
sb@sb:/tmp$ GIT_TRANSPORT_HELPER_DEBUG=1 git clone https://github.com/Bertram25/ValyriaTear.git tmp
Thanks. I think I see what is going on.

We finish the helper conversation here:
quoted
Checking connectivity... done.
Debug: Disconnecting.
error: git-remote-https died of signal 13
sb@sb:/tmp$ 
which means that remote-https is trying to exit, and is cleaning up any
curl connections. The actual SIGPIPE in the strace is here:

[pid 28319] write(3, "\25\3\2\0...[binary goo]...", 27) = -1 EPIPE (Broken pipe)

and if you walk backwards, fd 3 is:

  [pid 28319] socket(PF_INET, SOCK_STREAM, IPPROTO_TCP) = 3
  ...
  [pid 28319] connect(3, {sa_family=AF_INET,
                          sin_port=htons(443),
                          sin_addr=inet_addr("192.30.252.131")}, 16
                          ) = -1 EINPROGRESS (Operation now in progress)

So it's sending binary junk to the https socket while trying to exit,
which makes me guess that it's something to do with terminating the SSL
session, but the server has already hung up. Which would make it a curl
problem.

Googling "curl sigpipe" seems to come up with a report of this exact
case:

  http://curl.haxx.se/mail/archive-2013-01/0003.html
I cannot reproduce the error using the curl command from that site.
curl returns with 0.
quoted
with a bug opened here:

  http://sourceforge.net/p/curl/bugs/1180/

Looks like the fix went into curl 7.32.0. I have 7.33.0, which seems
fine. Can you confirm that your libcurl is a bit older?
dpkg -l |grep curl
ii  curl                                      7.32.0-1ubuntu1                            amd64        command line tool for transferring data with URL syntax
ii  libcurl3:amd64                            7.32.0-1ubuntu1                            amd64        easy-to-use client-side URL transfer library (OpenSSL flavour)
ii  libcurl3-gnutls:amd64                     7.32.0-1ubuntu1                            amd64        easy-to-use client-side URL transfer library (GnuTLS flavour)
ii  libcurl4-openssl-dev                      7.32.0-1ubuntu1                            amd64        development files and documentation for libcurl (OpenSSL flavour)
ii  python-pycurl                             7.19.0-5ubuntu8                            amd64        Python bindings to libcurl
Hmm. The fix in curl's 7d80ed64e435155 seems to involve strategically
placed calls to ignore SIGPIPE. I wonder if there is another spot that
needs similar treatment. It looks like curl_easy_cleanup is covered,
though, and that's where I would expect problem to come.

It would be interesting to see a backtrace from remote-curl when we get
the SIGPIPE. Doing so would be slightly tricky; instrumenting with the
patch below may be enough.

Another thought is that the curl fix seems to only kick in when built
with openssl support.  I'm not sure I understand how ubuntu's packaging
of curl uses gnutls versus openssl for the shared library. That may be
related.

-Peff

---
diff --git a/http.c b/http.c
index bcf54aa..ac709cc 100644
--- a/http.c
+++ b/http.c
@@ -473,13 +473,17 @@ void http_cleanup(void)
 {
 	struct active_request_slot *slot = active_queue_head;
 
+	warning("in http_cleanup");
 	while (slot != NULL) {
 		struct active_request_slot *next = slot->next;
 		if (slot->curl != NULL) {
 #ifdef USE_CURL_MULTI
+			warning("calling curl_multi_remove_handle");
 			curl_multi_remove_handle(curlm, slot->curl);
 #endif
+			warning("calling curl_easy_cleanup on slot");
 			curl_easy_cleanup(slot->curl);
+			warning("curl_easy_cleanup done");
 		}
 		free(slot);
 		slot = next;
@@ -487,13 +491,19 @@ void http_cleanup(void)
 	active_queue_head = NULL;
 
 #ifndef NO_CURL_EASY_DUPHANDLE
+	warning("calling curl_easy_cleanup on default");
 	curl_easy_cleanup(curl_default);
+	warning("curl_easy_cleanup done");
 #endif
 
 #ifdef USE_CURL_MULTI
+	warning("calling curl_multi_cleanup");
 	curl_multi_cleanup(curlm);
+	warning("curl_multi_cleanup done");
 #endif
+	warning("calling curl_global_cleanup");
 	curl_global_cleanup();
+	warning("curl_global_cleanup done");
 
 	curl_slist_free_all(pragma_header);
 	pragma_header = NULL;
Thread (21 messages) 21 messages, 6 authors, 2018-08-03
Keyboard shortcuts
hback out one level
jnext message in thread / next series-diff position
kprevious message in thread / previous series-diff position
ldrill in
Escclose help / fold thread tree
?toggle this help