Don't report EPIPE errors writing out packet information.

EPIPE almost certainly means "the next program after us in the pipeline
exited before we were finished writing", so this isn't a real error, it
just means we're done.  (We don't get SIGPIPE because libwireshark
ignores SIGPIPE to avoid getting killed if writing to the MaxMind
process gets SIGPIPE because that process died.)

Presumably either that program exited deliberately (for example, "head
-N" read N lines and printed them), in which case there's no error to
report, or it terminated due to an error or a signal, in which case
*that's* the error and that error has been reported.

(We don't do that for EINVAL, as that's presumably a real error.  It
shows up on Windows in bug 16192, but what we probably want to do there
is to, on Windows, use _doserrno, check for the equivalent Windows
errors, and, for the default case, convert _doserrno to the appropriate
string, using Windows APIs, and report *that* string; the MS C library
converts a whole bunch of Windows errors to EINVAL, thus losing
information and making it harder to determine what the real error is.

Therefore, I'm just marking this with Ping-Bug, as it's only fixing the
problem on UN*Xes.)

Change-Id: I94c392f478561e29501facd657487716a5882295
Ping-Bug: 16192
Reviewed-on: https://code.wireshark.org/review/35053
Petri-Dish: Guy Harris <guy@alum.mit.edu>
Tested-by: Petri Dish Buildbot
Reviewed-by: Guy Harris <guy@alum.mit.edu>
This commit is contained in:
Guy Harris 2019-11-11 12:31:08 -08:00
parent 7cbe0b2e15
commit 560f2e54ba
1 changed files with 17 additions and 0 deletions

View File

@ -4318,6 +4318,23 @@ show_print_file_io_error(int err)
break;
#endif
case EPIPE:
/*
* This almost certainly means "the next program after us in
* the pipeline exited before we were finished writing", so
* this isn't a real error, it just means we're done. (We
* don't get SIGPIPE because libwireshark ignores SIGPIPE
* to avoid getting killed if writing to the MaxMind process
* gets SIGPIPE because that process died.)
*
* Presumably either that program exited deliberately (for
* example, "head -N" read N lines and printed them), in
* which case there's no error to report, or it terminated
* due to an error or a signal, in which case *that's* the
* error and that error has been reported.
*/
break;
default:
cmdarg_err("An error occurred while printing packets: %s.",
g_strerror(err));