[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <202301121403.599806C597@keescook>
Date: Thu, 12 Jan 2023 14:06:49 -0800
From: Kees Cook <keescook@...omium.org>
To: Masahiro Yamada <masahiroy@...nel.org>
Cc: linux-kbuild@...r.kernel.org, linux-kernel@...r.kernel.org,
Nathan Chancellor <nathan@...nel.org>,
Nick Desaulniers <ndesaulniers@...gle.com>,
Tom Rix <trix@...hat.com>, llvm@...ts.linux.dev
Subject: Re: [PATCH] scripts: handle BrokenPipeError for python scripts
On Thu, Jan 12, 2023 at 11:30:06AM +0900, Masahiro Yamada wrote:
> def main():
> try:
> # simulate large output (your code replaces this loop)
> for x in range(10000):
> print("y")
> # flush output here to force SIGPIPE to be triggered
> # while inside this try block.
> sys.stdout.flush()
> except BrokenPipeError:
> # Python flushes standard streams on exit; redirect remaining output
> # to devnull to avoid another BrokenPipeError at shutdown
> devnull = os.open(os.devnull, os.O_WRONLY)
> os.dup2(devnull, sys.stdout.fileno())
> sys.exit(1) # Python exits with error code 1 on EPIPE
I still think this is wrong -- they should not continue piping, and
should just die with SIGPIPE. It should simply be:
signal(SIGPIPE, SIG_DFL);
Nothing else needed. No wasted CPU cycles, shell handling continues as
per normal.
> if __name__ == '__main__':
> main()
>
> Do not set SIGPIPE’s disposition to SIG_DFL in order to avoid
> BrokenPipeError. Doing that would cause your program to exit
> unexpectedly whenever any socket connection is interrupted while
> your program is still writing to it.
This advise is for socket programs, not command-line tools.
-Kees
--
Kees Cook
Powered by blists - more mailing lists