The following issue has been SUBMITTED.
======================================================================
https://cmake.org/Bug/view.php?id=15976
======================================================================
Reported By: Cristian Rodríguez
Assigned To:
======================================================================
Project: CMake
Issue ID: 15976
Category: CMake
Reproducibility: always
Severity: minor
Priority: normal
Status: new
======================================================================
Date Submitted: 2016-02-16 20:26 EST
Last Modified: 2016-02-16 20:26 EST
======================================================================
Summary: cmSystemTools::RandomSeed() requests excessive
entropy per invocation
Description:
cmSystemTools::RandomSeed() opens a *buffered* ifstream, the final result is
that each invocation requests _IO_BUFSIZ -1 of entropy to the operating system
instead of just sizeof(seed)
Steps to Reproduce:
mkdir test_cmake
echo "PROJECT(foo)" > CMakeLists.txt
cd test_cmake
strace -f -ocmake.trace cmake .
open cmake.trace
10768 26289 open("/dev/urandom", O_RDONLY) = 4
10769 26289 read(4,
"h\304j\vx\314\26\0042\250g\275\0014,\256\251\257T&\304\212\310\347q\201\263\324\330\273z8"...,
8191) = 8191
10770 26289 close(4) = 0
10771 26289 write(3, "cmake_minimum_required(VERSION 3"..., 795) = 795
10772 26289 close(3) = 0
10773 26289 stat("/home/crrodriguez/test_cmake/CMakeFiles/CMakeTmp",
{st_mode=S_IFDIR|0755, st_size=58, ...}) = 0
10774 26289 getcwd("/home/crrodriguez/test_cmake", 2048) = 29
Additional Information:
git diff
diff --git a/Source/cmSystemTools.cxx b/Source/cmSystemTools.cxx
index 3ba7287..26bec34 100644
--- a/Source/cmSystemTools.cxx
+++ b/Source/cmSystemTools.cxx
@@ -2184,8 +2184,10 @@ unsigned int cmSystemTools::RandomSeed()
} seed;
// Try using a real random source.
- cmsys::ifstream fin("/dev/urandom");
- if(fin && fin.read(seed.bytes, sizeof(seed)) &&
+ cmsys::ifstream fin;
+ fin.rdbuf()->pubsetbuf(0, 0);
+ fin.open("/dev/urandom");
+ if(fin.good() && fin.read(seed.bytes, sizeof(seed)) &&
fin.gcount() == sizeof(seed))
{
return seed.integer;
======================================================================
Issue History
Date Modified Username Field Change
======================================================================
2016-02-16 20:26 Cristian RodríguezNew Issue
======================================================================
--
Powered by www.kitware.com
Please keep messages on-topic and check the CMake FAQ at:
http://www.cmake.org/Wiki/CMake_FAQ
Kitware offers various services to support the CMake community. For more
information on each offering, please visit:
CMake Support: http://cmake.org/cmake/help/support.html
CMake Consulting: http://cmake.org/cmake/help/consulting.html
CMake Training Courses: http://cmake.org/cmake/help/training.html
Visit other Kitware open-source projects at
http://www.kitware.com/opensource/opensource.html
Follow this link to subscribe/unsubscribe:
http://public.kitware.com/mailman/listinfo/cmake-developers