diff options
author | Junio C Hamano <gitster@pobox.com> | 2024-09-23 19:35:06 +0200 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2024-09-23 19:35:06 +0200 |
commit | a4f062bdcf0c1055aa2cabd207b9f1a1be8d8823 (patch) | |
tree | fadb414209555945332ef27758aba15bb29e7659 /transport-helper.c | |
parent | Merge branch 'jc/t5512-sigpipe-fix' (diff) | |
parent | print an error when remote helpers die during capabilities (diff) | |
download | git-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.c | 16 |
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; |