Fix pager regression
authorTom Tromey <tromey@adacore.com>
Mon, 3 Jan 2022 16:48:37 +0000 (09:48 -0700)
committerTom Tromey <tromey@adacore.com>
Wed, 5 Jan 2022 13:49:08 +0000 (06:49 -0700)
The patch to fix paging with redirection caused a regression in the
internal AdaCore test suite.  The problem occurs when running an MI
command from the CLI using interpreter-exec, when paging is enabled.
This scenario isn't covered by the current test suite, so this patch
includes a new test.

The problem is that, in this situation, MI does:

  fputs_unfiltered (strcmp (context->command, "target-select") == 0
     ? "^connected" : "^done", mi->raw_stdout);

Here raw_stdout is a stdio_file wrapping stdout, so the pager thinks
that it is ok to buffer the output.  However, in this setup, it isn't
ok, and flushing the wrap buffer doesn't really work properly.  Also,
MI next does:

  mi_out_put (uiout, mi->raw_stdout);

... but this uses ui_file::write, which also doesn't flush the wrap
buffer.

I think all this will be fixed by the pager rewrite series I'm working
on.  However, in the meantime, adding the old gdb_stdout check back to
the pager fixes this problem.

Regression tested on x86-64 Fedora 34.

gdb/testsuite/gdb.base/page-logging.exp
gdb/utils.c

index 05a3f793f5d2e54c4559f61be41476371a6de854..ffc180aad4dbc61dc76dcf6626772f0e02ff8829 100644 (file)
@@ -48,3 +48,13 @@ if {$ok} {
     fail "printf without paging"
 }
 gdb_test "set logging enabled off" "Done logging to .*"
+
+set cmd "interpreter-exec mi2 \"-data-evaluate-expression 23\""
+gdb_test_multiple $cmd $cmd {
+    -re ".done.value=.23\[^\n\]+\r\n$gdb_prompt " {
+       pass "$cmd"
+       gdb_expect 1 {
+           -re "\r\n$gdb_prompt $" { }
+       }
+    }
+}
index 11f88d6f991ea1cec12dbfac9bf8ae4cf1e87ac7..df4e6c1fd58e1ea63a6baa39bfca5eb1d222760f 100644 (file)
@@ -1750,6 +1750,7 @@ fputs_maybe_filtered (const char *linebuffer, struct ui_file *stream,
 
   /* Don't do any filtering if it is disabled.  */
   if (!stream->can_page ()
+      || stream != gdb_stdout
       || !pagination_enabled
       || pagination_disabled_for_command
       || batch_flag