From: Dmitry V. Levin Date: Sun, 6 Aug 2017 11:26:52 +0000 (+0000) Subject: Enhance fflush error diagnostics X-Git-Tag: v4.19~177 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=255bc6fded7cd6b5e96a0f999f85dca0e8e2699a;p=strace Enhance fflush error diagnostics * strace.c (flush_tcp_output): New function. (line_ended, droptcb, print_event_exit): Use it to flush tcp->outf. * tests/fflush.c: New file. * tests/fflush.test: New test. * tests/Makefile.am (MISC_TESTS): Add it. * tests/.gitignore: Add fflush. * tests/pure_executables.list: Likewise. --- diff --git a/strace.c b/strace.c index b0d9b88a..5a2adf02 100644 --- a/strace.c +++ b/strace.c @@ -591,6 +591,7 @@ tvprintf(const char *const fmt, va_list args) if (current_tcp) { int n = vfprintf(current_tcp->outf, fmt, args); if (n < 0) { + /* very unlikely due to vfprintf buffering */ if (current_tcp->outf != stderr) perror_msg("%s", outfname); } else @@ -620,6 +621,7 @@ tprints(const char *str) current_tcp->curcol += strlen(str); return; } + /* very unlikely due to fputs_unlocked buffering */ if (current_tcp->outf != stderr) perror_msg("%s", outfname); } @@ -646,12 +648,19 @@ tprintf_comment(const char *fmt, ...) va_end(args); } +static void +flush_tcp_output(const struct tcb *const tcp) +{ + if (fflush(tcp->outf) && tcp->outf != stderr) + perror_msg("%s", outfname); +} + void line_ended(void) { if (current_tcp) { current_tcp->curcol = 0; - fflush(current_tcp->outf); + flush_tcp_output(current_tcp); } if (printing_tcp) { printing_tcp->curcol = 0; @@ -861,7 +870,7 @@ droptcb(struct tcb *tcp) } else { if (printing_tcp == tcp && tcp->curcol != 0) fprintf(tcp->outf, " \n"); - fflush(tcp->outf); + flush_tcp_output(tcp); } } @@ -2240,7 +2249,7 @@ print_event_exit(struct tcb *tcp) && printing_tcp->curcol != 0) { current_tcp = printing_tcp; tprints(" \n"); - fflush(printing_tcp->outf); + flush_tcp_output(printing_tcp); printing_tcp->curcol = 0; current_tcp = tcp; } diff --git a/tests/.gitignore b/tests/.gitignore index e8f5ec60..ad80c53b 100644 --- a/tests/.gitignore +++ b/tests/.gitignore @@ -66,6 +66,7 @@ fchownat fcntl fcntl64 fdatasync +fflush file_handle file_ioctl filter-unavailable diff --git a/tests/Makefile.am b/tests/Makefile.am index 717e0370..6d384929 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -256,6 +256,7 @@ MISC_TESTS = \ detach-sleeping.test \ detach-stopped.test \ filter-unavailable.test \ + fflush.test \ get_regs.test \ interactive_block.test \ ksysent.test \ diff --git a/tests/fflush.c b/tests/fflush.c new file mode 100644 index 00000000..84a62ec2 --- /dev/null +++ b/tests/fflush.c @@ -0,0 +1,42 @@ +/* + * Check fflush error diagnostics. + * + * Copyright (c) 2017 The strace developers. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include "tests.h" + +#include +#include +#include + +int +main(void) +{ + errno = ENOSPC; + printf("%s: /dev/full: %m\n", getenv("STRACE_EXE") ?: "strace"); + return 0; +} diff --git a/tests/fflush.test b/tests/fflush.test new file mode 100755 index 00000000..c0f4e3fc --- /dev/null +++ b/tests/fflush.test @@ -0,0 +1,41 @@ +#!/bin/sh -efu +# +# Check fflush error diagnostics. +# +# Copyright (c) 2011-2017 The strace developers. +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# 3. The name of the author may not be used to endorse or promote products +# derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR +# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +. "${srcdir=.}/init.sh" + +run_prog > /dev/null +args="-o /dev/full -e trace=none $args" + +$STRACE $args > "$EXP" 2> "$LOG" || { + msg="$STRACE $args failed with code $?" + cat "$LOG" >&2 + fail_ "$msg" +} + +match_diff "$LOG" "$EXP" diff --git a/tests/pure_executables.list b/tests/pure_executables.list index fddf6910..3d05531c 100755 --- a/tests/pure_executables.list +++ b/tests/pure_executables.list @@ -50,6 +50,7 @@ fchownat fcntl fcntl64 fdatasync +fflush file_handle file_ioctl finit_module