summaryrefslogtreecommitdiff
path: root/trace2
diff options
context:
space:
mode:
authorLibravatar Junio C Hamano <gitster@pobox.com>2021-12-10 14:35:08 -0800
committerLibravatar Junio C Hamano <gitster@pobox.com>2021-12-10 14:35:08 -0800
commit9b0a970ace0316662697cd9db326bcfb48e36838 (patch)
treee8794d747ddf11732516c84f39589fdfc30fe79a /trace2
parentMerge branch 'jt/pack-header-lshift-overflow' (diff)
parenttrace2: disable tr2_dst before warning on write errors (diff)
downloadtgif-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.c9
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);
}