diff options
author | Junio C Hamano <gitster@pobox.com> | 2021-12-10 14:35:08 -0800 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2021-12-10 14:35:08 -0800 |
commit | 9b0a970ace0316662697cd9db326bcfb48e36838 (patch) | |
tree | e8794d747ddf11732516c84f39589fdfc30fe79a /trace2 | |
parent | Merge branch 'jt/pack-header-lshift-overflow' (diff) | |
parent | trace2: disable tr2_dst before warning on write errors (diff) | |
download | tgif-9b0a970ace0316662697cd9db326bcfb48e36838.tar.xz |
Merge branch 'js/trace2-avoid-recursive-errors'
trace2 error code path fix.
* js/trace2-avoid-recursive-errors:
trace2: disable tr2_dst before warning on write errors
Diffstat (limited to 'trace2')
-rw-r--r-- | trace2/tr2_dst.c | 9 |
1 files changed, 7 insertions, 2 deletions
diff --git a/trace2/tr2_dst.c b/trace2/tr2_dst.c index bda283e7f4..8a21dd2972 100644 --- a/trace2/tr2_dst.c +++ b/trace2/tr2_dst.c @@ -1,4 +1,5 @@ #include "cache.h" +#include "sigchain.h" #include "trace2/tr2_dst.h" #include "trace2/tr2_sid.h" #include "trace2/tr2_sysenv.h" @@ -360,6 +361,7 @@ int tr2_dst_trace_want(struct tr2_dst *dst) void tr2_dst_write_line(struct tr2_dst *dst, struct strbuf *buf_line) { int fd = tr2_dst_get_trace_fd(dst); + ssize_t bytes; strbuf_complete_line(buf_line); /* ensure final NL on buffer */ @@ -378,12 +380,15 @@ void tr2_dst_write_line(struct tr2_dst *dst, struct strbuf *buf_line) * * If we get an IO error, just close the trace dst. */ - if (write(fd, buf_line->buf, buf_line->len) >= 0) + sigchain_push(SIGPIPE, SIG_IGN); + bytes = write(fd, buf_line->buf, buf_line->len); + sigchain_pop(SIGPIPE); + if (bytes >= 0) return; + tr2_dst_trace_disable(dst); if (tr2_dst_want_warning()) warning("unable to write trace to '%s': %s", tr2_sysenv_display_name(dst->sysenv_var), strerror(errno)); - tr2_dst_trace_disable(dst); } |