Fix crash in PosixWritableFile::Close() when fstat() fails
Summary: We had a crash in this code: `fstat()` failed; `file_stats` contained garbage, in particular `file_stats.st_blksize == 6`; the expression `file_stats.st_blocks / (file_stats.st_blksize / 512)` divided by zero. Closes https://github.com/facebook/rocksdb/pull/2420 Differential Revision: D5216110 Pulled By: al13n321 fbshipit-source-id: 6d8fc5e7c4f98c1139e68c7829ebdbac68b0fce0
This commit is contained in:
parent
5de4fff167
commit
f2a0fa2640
5
env/io_posix.cc
vendored
5
env/io_posix.cc
vendored
@ -796,10 +796,11 @@ Status PosixWritableFile::Close() {
|
|||||||
// While we work with Travis-CI team to figure out if this is a
|
// While we work with Travis-CI team to figure out if this is a
|
||||||
// quirk of Docker/AUFS, we will comment this out.
|
// quirk of Docker/AUFS, we will comment this out.
|
||||||
struct stat file_stats;
|
struct stat file_stats;
|
||||||
fstat(fd_, &file_stats);
|
int result = fstat(fd_, &file_stats);
|
||||||
// After ftruncate, we check whether ftruncate has the correct behavior.
|
// After ftruncate, we check whether ftruncate has the correct behavior.
|
||||||
// If not, we should hack it with FALLOC_FL_PUNCH_HOLE
|
// If not, we should hack it with FALLOC_FL_PUNCH_HOLE
|
||||||
if ((file_stats.st_size + file_stats.st_blksize - 1) /
|
if (result == 0 &&
|
||||||
|
(file_stats.st_size + file_stats.st_blksize - 1) /
|
||||||
file_stats.st_blksize !=
|
file_stats.st_blksize !=
|
||||||
file_stats.st_blocks / (file_stats.st_blksize / 512)) {
|
file_stats.st_blocks / (file_stats.st_blksize / 512)) {
|
||||||
IOSTATS_TIMER_GUARD(allocate_nanos);
|
IOSTATS_TIMER_GUARD(allocate_nanos);
|
||||||
|
Loading…
Reference in New Issue
Block a user