• Michael Ellerman's avatar
    selftests/harness: Flush stdout before forking · c8bd596f
    Michael Ellerman authored
    The test harness forks() a child to run each test. Both the parent and
    the child print to stdout using libc functions. That can lead to
    duplicated (or more) output if the libc buffers are not flushed before
    forking.
    
    It's generally not seen when running programs directly, because stdout
    will usually be line buffered when it's pointing to a terminal.
    
    This was noticed when running the seccomp_bpf test, eg:
    
      $ ./seccomp_bpf | tee test.log
      $ grep -c "TAP version 13" test.log
      2
    
    But we only expect the TAP header to appear once.
    
    It can be exacerbated using stdbuf to increase the buffer size:
    
      $ stdbuf -o 1MB ./seccomp_bpf > test.log
      $ grep -c "TAP version 13" test.log
      13
    
    The fix is simple, we just flush stdout & stderr before fork. Usually
    stderr is unbuffered, but that can be changed, so flush it as well
    just to be safe.
    Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
    Tested-by: default avatarMax Filippov <jcmvbkbc@gmail.com>
    Acked-by: default avatarShuah Khan <skhan@linuxfoundation.org>
    Acked-by: default avatarKees Cook <keescook@chromium.org>
    Signed-off-by: default avatarShuah Khan <skhan@linuxfoundation.org>
    c8bd596f
kselftest_harness.h 27.9 KB