From b3896f93b26c1102f2314b8218e210f87a99366d Mon Sep 17 00:00:00 2001 From: Andrew Wood Date: Fri, 20 Mar 2026 23:00:44 +0000 Subject: [PATCH] Add more debugging, and set the pipefd entries to -1 after closing them to avoid double-close (#67). --- src/main/main.c | 26 ++++++++++++++++++++++---- src/pv/loop.c | 2 +- 2 files changed, 23 insertions(+), 5 deletions(-) diff --git a/src/main/main.c b/src/main/main.c index b8a27a3..ef84612 100644 --- a/src/main/main.c +++ b/src/main/main.c @@ -131,10 +131,12 @@ static int pv__set_output(pvstate_t state, opts_t opts, /*@null@ */ const char * return 0; if (NULL == output_file || 0 == strcmp(output_file, "-")) { + debug("%s", "setting output to stdout"); pv_state_output_set(state, STDOUT_FILENO, "(stdout)"); return 0; } + debug("%s: %s", "setting output", output_file); output_fd = open(output_file, O_WRONLY | O_CREAT | O_TRUNC, 0600); /* flawfinder: ignore */ /* * flawfinder rationale: the output filename has been @@ -347,6 +349,7 @@ static int pv__monitor(pvstate_t state, opts_t opts) fprintf(stderr, "%s: %s\n", opts->program_name, strerror(errno)); return PV_ERROREXIT_MONITOR; } + debug("pipefd_in[]=(%d,%d)", pipefd_in[0], pipefd_in[1]); } /* Pipe for the output side of the command, if we're monitoring it. */ @@ -359,6 +362,7 @@ static int pv__monitor(pvstate_t state, opts_t opts) (void) close(pipefd_in[1]); return PV_ERROREXIT_MONITOR; } + debug("pipefd_out[]=(%d,%d)", pipefd_out[0], pipefd_out[1]); } /* Create a process to run the command. */ @@ -378,28 +382,38 @@ static int pv__monitor(pvstate_t state, opts_t opts) /* Command process. */ /* Close the write end of the "in" pipe. */ - if (-1 != pipefd_in[1]) + if (-1 != pipefd_in[1]) { (void) close(pipefd_in[1]); + pipefd_in[1] = -1; + } /* Close the read end of the "out" pipe. */ - if (-1 != pipefd_out[0]) + if (-1 != pipefd_out[0]) { (void) close(pipefd_out[0]); + pipefd_out[0] = -1; + } /* Put the read end of the "in" pipe on stdin. */ if (-1 != pipefd_in[0]) { + debug("replacing command stdin with fd %d", pipefd_in[0]); if (dup2(pipefd_in[0], STDIN_FILENO) < 0) { fprintf(stderr, "%s: %s\n", opts->program_name, strerror(errno)); exit(EXIT_FAILURE); } (void) close(pipefd_in[0]); + debug("replaced command stdin with fd %d", pipefd_in[0]); + pipefd_in[0] = -1; } /* Put the write end of the "out" pipe on stdout. */ if (-1 != pipefd_out[1]) { + debug("replacing command stdout with fd %d", pipefd_out[1]); if (dup2(pipefd_out[1], STDOUT_FILENO) < 0) { fprintf(stderr, "%s: %s\n", opts->program_name, strerror(errno)); exit(EXIT_FAILURE); } (void) close(pipefd_out[1]); + debug("replaced command stdout with fd %d", pipefd_out[1]); + pipefd_out[1] = -1; } /* Execute the command. */ @@ -418,11 +432,15 @@ static int pv__monitor(pvstate_t state, opts_t opts) /* Main process, not the command process. */ /* Close the read end of the "in" pipe. */ - if (-1 != pipefd_in[0]) + if (-1 != pipefd_in[0]) { (void) close(pipefd_in[0]); + pipefd_in[0] = -1; + } /* Close the write end of the "out" pipe. */ - if (-1 != pipefd_out[1]) + if (-1 != pipefd_out[1]) { (void) close(pipefd_out[1]); + pipefd_out[1] = -1; + } /* * If monitoring both input and output, create a process for diff --git a/src/pv/loop.c b/src/pv/loop.c index cc533d8..776c832 100644 --- a/src/pv/loop.c +++ b/src/pv/loop.c @@ -213,7 +213,7 @@ int pv_main_loop(pvstate_t state) /*@-type@ */ if ((sb.st_mode & S_IFMT) == S_IFIFO) { output_is_pipe = true; - debug("%s", "output is a pipe"); + debug("%s (fd %d)", "output is a pipe", output_fd); } /*@+type@ *//* splint says st_mode is __mode_t, not mode_t */ } else {