summaryrefslogtreecommitdiffstats
path: root/transport-helper.c
diff options
context:
space:
mode:
authorJunio C Hamano <gitster@pobox.com>2024-09-23 19:35:06 +0200
committerJunio C Hamano <gitster@pobox.com>2024-09-23 19:35:06 +0200
commita4f062bdcf0c1055aa2cabd207b9f1a1be8d8823 (patch)
treefadb414209555945332ef27758aba15bb29e7659 /transport-helper.c
parentMerge branch 'jc/t5512-sigpipe-fix' (diff)
parentprint an error when remote helpers die during capabilities (diff)
downloadgit-a4f062bdcf0c1055aa2cabd207b9f1a1be8d8823.tar.xz
git-a4f062bdcf0c1055aa2cabd207b9f1a1be8d8823.zip
Merge branch 'jk/diag-unexpected-remote-helper-death'
When a remote-helper dies before Git writes to it, SIGPIPE killed Git silently. We now explain the situation a bit better to the end user in our error message. * jk/diag-unexpected-remote-helper-death: print an error when remote helpers die during capabilities
Diffstat (limited to 'transport-helper.c')
-rw-r--r--transport-helper.c16
1 files changed, 13 insertions, 3 deletions
diff --git a/transport-helper.c b/transport-helper.c
index abe16eea65..c688967b8c 100644
--- a/transport-helper.c
+++ b/transport-helper.c
@@ -89,11 +89,18 @@ static int recvline(struct helper_data *helper, struct strbuf *buffer)
return recvline_fh(helper->out, buffer);
}
-static void write_constant(int fd, const char *str)
+static int write_constant_gently(int fd, const char *str)
{
if (debug)
fprintf(stderr, "Debug: Remote helper: -> %s", str);
if (write_in_full(fd, str, strlen(str)) < 0)
+ return -1;
+ return 0;
+}
+
+static void write_constant(int fd, const char *str)
+{
+ if (write_constant_gently(fd, str) < 0)
die_errno(_("full write to remote helper failed"));
}
@@ -168,13 +175,16 @@ static struct child_process *get_helper(struct transport *transport)
die_errno(_("can't dup helper output fd"));
data->out = xfdopen(duped, "r");
- write_constant(helper->in, "capabilities\n");
+ sigchain_push(SIGPIPE, SIG_IGN);
+ if (write_constant_gently(helper->in, "capabilities\n") < 0)
+ die("remote helper '%s' aborted session", data->name);
+ sigchain_pop(SIGPIPE);
while (1) {
const char *capname, *arg;
int mandatory = 0;
if (recvline(data, &buf))
- exit(128);
+ die("remote helper '%s' aborted session", data->name);
if (!*buf.buf)
break;