Don't allocate std::random_device statically #1743
Merged
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
It appears that on Linux with gcc (tested with gcc 4.6.3 on Ubuntu 12.04 and
gcc 5.2.1 on Ubuntu 15.10) std::random_device will open /dev/urandom, and keep
the file open for the lifetime of the std::random_device object.
Since libsass allocates the std::random_device globally, it will not be
destroyed if the process execs. Futhermore std::random_device does not set
close-on-exec on the fd, so the fd will be leaked to the child process.
The std::random_device object is only used by the GetSeed function, and as the
GetSeed function is only called once to seed the rand variable, there is no
need to keep the std::random_device object.
So this patch moves the std::random_device object into the GetSeed function,
thereby eliminating the fd-leak.
The following program illustrates the problem:
Output from program before this patch:
Output from program after this patch: