From 100ebad746bbc310bb56bfd1c11e6054970ab873 Mon Sep 17 00:00:00 2001 From: Brian Watling Date: Wed, 5 Nov 2014 14:50:37 -0800 Subject: [PATCH] Fix crashes in readRandomDevice() Summary: The comment in readRandomDevice() lies - the PCHECK fails with "Bad file descriptor" in some tests. This is most likely due to a race where a background thread is calling readRandomDevice() while the main thread shuts down. Another possibility is bad destruction order, where rnadomDevice is destroyed before some other static object whose destructor calls readRandomDevice(). Either way, this fixes it without having to chace down every instance. Test Plan: run unit tests Reviewed By: meyering@fb.com Subscribers: antonl, trunkagent, meyering, simpkins, njormrod, folly-diffs@, tao-eng@ FB internal diff: D1660903 Signature: t1:1660903:1415215895:7f1f96ab7416b45c4dc18e78173fb59eb27bd03b --- folly/Random.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/folly/Random.cpp b/folly/Random.cpp index 533ac407..4ed578c3 100644 --- a/folly/Random.cpp +++ b/folly/Random.cpp @@ -31,8 +31,9 @@ namespace folly { namespace { void readRandomDevice(void* data, size_t size) { - // Keep it open for the duration of the program - static File randomDevice("/dev/urandom"); + // Keep it open for the duration of the program. Note that we leak the File + // to ensure the file is indeed open for the duration of the program. + static File& randomDevice = *new File("/dev/urandom"); auto bytesRead = readFull(randomDevice.fd(), data, size); PCHECK(bytesRead >= 0 && size_t(bytesRead) == size); } -- 2.34.1