[libFuzzer] Fix fd check in DupAndCloseStderr.
authorMarco Vanotti <mvanotti@google.com>
Thu, 10 Oct 2019 05:47:30 +0000 (22:47 -0700)
committerMarco Vanotti <mvanotti@google.com>
Thu, 21 Nov 2019 23:25:10 +0000 (15:25 -0800)
commit16d9f44fd154b409b1c7f0876ba7c767b60cb3da
treea08e42a8fdfaf5bc3cc4164b0d68c0b4a2731954
parent0163329dbd6c687453a27f72e21512a8c151c5b3
[libFuzzer] Fix fd check in DupAndCloseStderr.

Summary:
This commit fixes the check in the return value from the `DuplicateFile`
function, which returns a new file descriptor. `DuplicateFile` can
return 0 if that file descriptor is available (for example, if stdin has
already been closed).

In particular, this could cause a bug with the `-close_fd_mask` flag in
some platforms: just call the fuzzer with stdin closed and the
`-close_fd_mask=2` flag, and stderr will not be muted.

Example fuzzer:

```

extern "C" int LLVMFuzzerTestOneInput(const uint8_t* Data, size_t Size) {
  fprintf(stderr, "STDERR\n");
  fprintf(stdout, "STDOUT\n");
  return 0;
}
```

Invocation (muting both stderr and stdout):
```
./test -close_fd_mask=3 -runs=1 0<&-
INFO: Seed: 1155116940
INFO: Loaded 1 modules   (1 inline 8-bit counters): 1 [0x48b020, 0x48b021),
INFO: Loaded 1 PC tables (1 PCs): 1 [0x478dc8,0x478dd8),
INFO: -max_len is not provided; libFuzzer will not generate inputs larger than 4096 bytes
STDERR
INFO: A corpus is not provided, starting from an empty corpus
STDERR
Done 2 runs in 0 second(s)
```

Reviewers: mcgrathr, jakehehrlich, phosek, kcc, aarongreen

Subscribers: #sanitizers, llvm-commits

Tags: #sanitizers, #llvm

Differential Revision: https://reviews.llvm.org/D68775
compiler-rt/lib/fuzzer/FuzzerIO.cpp