On Tue, Sep 23, 2025 at 02:34:17PM -0700, Kees Cook wrote:
> The kconfig test harness ("make testconfig") was generating BrokenPipeError
> warnings when running interactive tests like oldaskconfig and oldconfig:
> 
>   /usr/lib/python3/dist-packages/_pytest/unraisableexception.py:85: 
> PytestUnraisableExceptionWarning: Exception ignored in: <_io.BufferedWriter 
> name=12>
> 
>   Traceback (most recent call last):
>     File "/srv/code/scripts/kconfig/tests/conftest.py", line 127, in 
> oldaskconfig
>       return self._run_conf('--oldaskconfig', dot_config=dot_config,
>              ~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
>                             interactive=True, in_keys=in_keys)
>                             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
>   BrokenPipeError: [Errno 32] Broken pipe
> 
> The issue occurred when the test framework attempted to write to stdin
> after the conf subprocess had already exited.
> 
> Wrap stdin write operations in try/except to catch BrokenPipeError and
> stop sending more input. Add explicit flush() after writes so we can see
> delivery errors immediately. Ignore BrokenPipeError when closing stdin.
> Explicitly call wait() to validate subprocess termination.
> 
> Signed-off-by: Kees Cook <[email protected]>
> ---

Reviewed-by: Nathan Chancellor <[email protected]>
Tested-by: Nathan Chancellor <[email protected]>

> ---
>  scripts/kconfig/tests/conftest.py | 17 ++++++++++++++++-
>  1 file changed, 16 insertions(+), 1 deletion(-)
> 
> diff --git a/scripts/kconfig/tests/conftest.py 
> b/scripts/kconfig/tests/conftest.py
> index 2a2a7e2da060..d94b79e012c0 100644
> --- a/scripts/kconfig/tests/conftest.py
> +++ b/scripts/kconfig/tests/conftest.py
> @@ -81,7 +81,22 @@ class Conf:
>                  # For interactive modes such as oldaskconfig, oldconfig,
>                  # send 'Enter' key until the program finishes.
>                  if interactive:
> -                    ps.stdin.write(b'\n')
> +                    try:
> +                        ps.stdin.write(b'\n')
> +                        ps.stdin.flush()
> +                    except (BrokenPipeError, OSError):
> +                        # Process has exited, stop sending input
> +                        break
> +
> +            # Close stdin gracefully
> +            try:
> +                ps.stdin.close()
> +            except (BrokenPipeError, OSError):
> +                # Ignore broken pipe on close
> +                pass
> +
> +            # Wait for process to complete
> +            ps.wait()
>  
>              self.retcode = ps.returncode
>              self.stdout = ps.stdout.read().decode()
> -- 
> 2.34.1
> 

Reply via email to