From: Jonathan Wakely Date: Fri, 11 Sep 2015 13:44:26 +0000 (+0100) Subject: Check read() result in std::random_device. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=42b6aad9ef7d70975b910e3f2835b03d5ae2d8bb;p=gcc.git Check read() result in std::random_device. PR libstdc++/65142 * src/c++11/random.cc (random_device::_M_getval()): Check read result. From-SVN: r227687 --- diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index 42f6a54b94e..b4618effe80 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,8 @@ +2015-09-11 Jonathan Wakely + + PR libstdc++/65142 + * src/c++11/random.cc (random_device::_M_getval()): Check read result. + 2015-09-11 John Marino Jonathan Wakely diff --git a/libstdc++-v3/src/c++11/random.cc b/libstdc++-v3/src/c++11/random.cc index edf900f6bb7..1d102c755b2 100644 --- a/libstdc++-v3/src/c++11/random.cc +++ b/libstdc++-v3/src/c++11/random.cc @@ -130,13 +130,17 @@ namespace std _GLIBCXX_VISIBILITY(default) #endif result_type __ret; + #ifdef _GLIBCXX_HAVE_UNISTD_H - read(fileno(static_cast(_M_file)), - static_cast(&__ret), sizeof(result_type)); + auto e = read(fileno(static_cast(_M_file)), + static_cast(&__ret), sizeof(result_type)); #else - std::fread(static_cast(&__ret), sizeof(result_type), - 1, static_cast(_M_file)); + auto e = std::fread(static_cast(&__ret), sizeof(result_type), + 1, static_cast(_M_file)); #endif + if (e != sizeof(result_type)) + __throw_runtime_error(__N("random_device could not read enough bytes")); + return __ret; }