git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: Is t7006-pager.sh racy?

From
Jeff King <peff@peff.net>
Date
Nov 21, 2021, 18:40 UTC
Message-ID
<YZqSgu4XjPWnURju@coredump.intra.peff.net>
In-Reply-To
<20211024170349.GA2101@szeder.dev>
On Sun, Oct 24, 2021 at 07:03:49PM +0200, SZEDER Gábor wrote:
Show 5 quoted lines
> > What makes us expect that the "git log" invocation should trigger a
> > SIGPIPE in the first place?
> 
> A misunderstanding, perhaps, because those 'git log' commands with
> their early-exiting pagers rarely trigger SIGPIPE.

I happened to be looking in this area today[1], and I think it turns out not to be "rarely", but rather "never" for some of the tests.

The test in question sets the pager to "does-not-exist". But in that case we will realize immediately via run-command.c that we could not run the pager, and will not even redirect our stdout to it.

For example, doing this:
  GIT_PAGER=does-not-exist git -c alias.foo='!yes' -p foo

will never get SIGPIPE; it will just write infinitely to the original stdout, and return success.

Whereas this:
  GIT_PAGER=false git -c alias.foo='!yes' -p foo

will reliably get SIGPIPE. But even if we used it (with a while loop to instead of "yes" address the portability concern), the tests in t7006 would still be wrong, because they are sending test-terminal's output to a closed pipe (so we'd still see SIGPIPE regardless of Git's behavior). They should be sending test_terminal's output to a file or /dev/null.

It seems like this thread stalled. Ævar, were you planning to fix these tests?

It's not too hard to swap out a "yes" as I showed above, but it further confuses the trace2 output, because now we have the child yes (or its shell equivalent) exiting as well.

The non-child "log --stdin" example I gave earlier in the thread avoids that, but the fifo hackery is so horrible that I'd just as soon avoid it. I guess yet another option is a builtin which produces infinite output. Perhaps:

  oid=$(git rev-parse HEAD)
  while true; do echo $oid; done |
  test_terminal git -p cat-file --batch-check

That's guaranteed to get SIGPIPE eventually if the pager stops reading. I seem to recall that test_terminal's handling of stdin is somewhat broken, though, and would probably get in our way[2]. Possibly we could just rip it out, as nobody is relying on it (they can't be, because it's broken).

-Peff
[1] https://lore.kernel.org/git/YZqSBlvzz2KgOMnJ@coredump.intra.peff.net/
[2] https://lore.kernel.org/git/20190520125016.GA13474@sigill.intra.peff.net/
Previous: Jeff KingNext: Jeff King
Message 6 of 17 in “Is t7006-pager.sh racy?”
  1. Junio C HamanoOct 24, 2021
  2. SZEDER GáborOct 24, 2021
  3. Jeff KingOct 25, 2021
  4. SZEDER GáborOct 28, 2021
  5. Jeff KingOct 28, 2021
  6. Jeff KingNov 21, 2021
  7. Jeff KingNov 21, 2021
  8. t7006: clean up SIGPIPE handling in trace2 testsJeff King, Nov 21, 2021
  9. Jeff KingNov 21, 2021
  10. Junio C HamanoNov 22, 2021
  11. Jeff KingNov 22, 2021
  12. Jeff KingNov 22, 2021
  13. Junio C HamanoNov 22, 2021
  14. Junio C HamanoNov 22, 2021
  15. Jeff KingNov 22, 2021
  16. run-command: unify signal and regular logic for wait_or_whine()Jeff King, Nov 22, 2021
  17. Ævar Arnfjörð BjarmasonDec 1, 2021

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.