OSDN Git Service

Fix crash when multiple raw_fd_ostreams to stdout are created.
authorRafael Espindola <rafael.espindola@gmail.com>
Mon, 13 Mar 2017 14:45:06 +0000 (14:45 +0000)
committerRafael Espindola <rafael.espindola@gmail.com>
Mon, 13 Mar 2017 14:45:06 +0000 (14:45 +0000)
commitb8ff3dcbf68c3b1bbd50adab465968f8e6611755
treef24f4396cec643c4caad8f0818c14860b88de21f
parent9ce81e13edc22a3059eb9f09742b4d5a40626ebe
Fix crash when multiple raw_fd_ostreams to stdout are created.

If raw_fd_ostream is constructed with the path of "-", it claims
ownership of the stdout file descriptor. This means that it closes
stdout when it is destroyed. If there are multiple users of
raw_fd_ostream wrapped around stdout, then a crash can occur because
of operations on a closed stream.

An example of this would be running something like "clang -S -o - -MD
-MF - test.cpp". Alternatively, using outs() (which creates a local
version of raw_fd_stream to stdout) anywhere combined with such a
stream usage would cause the crash.

The fix duplicates the stdout file descriptor when used within
raw_fd_ostream, so that only that particular descriptor is closed when
the stream is destroyed.

Patch by James Henderson!

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@297624 91177308-0d34-0410-b5e6-96231b3b80d8
lib/Support/raw_ostream.cpp
test/Other/writing-to-stdout.ll [new file with mode: 0644]
unittests/Support/raw_ostream_test.cpp