aboutsummaryrefslogtreecommitdiff
path: root/libstdc++-v3/src
diff options
context:
space:
mode:
authorJonathan Wakely <jwakely@redhat.com>2015-09-11 14:44:26 +0100
committerJonathan Wakely <redi@gcc.gnu.org>2015-09-11 14:44:26 +0100
commit42b6aad9ef7d70975b910e3f2835b03d5ae2d8bb (patch)
treebf41ef1879a653d9a02ae21f9e54237c82685b04 /libstdc++-v3/src
parent1b741475ffeaee73f6ebb4115386e84be41f3a8d (diff)
downloadgcc-42b6aad9ef7d70975b910e3f2835b03d5ae2d8bb.zip
gcc-42b6aad9ef7d70975b910e3f2835b03d5ae2d8bb.tar.gz
gcc-42b6aad9ef7d70975b910e3f2835b03d5ae2d8bb.tar.bz2
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
Diffstat (limited to 'libstdc++-v3/src')
-rw-r--r--libstdc++-v3/src/c++11/random.cc12
1 files changed, 8 insertions, 4 deletions
diff --git a/libstdc++-v3/src/c++11/random.cc b/libstdc++-v3/src/c++11/random.cc
index edf900f..1d102c7 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<FILE*>(_M_file)),
- static_cast<void*>(&__ret), sizeof(result_type));
+ auto e = read(fileno(static_cast<FILE*>(_M_file)),
+ static_cast<void*>(&__ret), sizeof(result_type));
#else
- std::fread(static_cast<void*>(&__ret), sizeof(result_type),
- 1, static_cast<FILE*>(_M_file));
+ auto e = std::fread(static_cast<void*>(&__ret), sizeof(result_type),
+ 1, static_cast<FILE*>(_M_file));
#endif
+ if (e != sizeof(result_type))
+ __throw_runtime_error(__N("random_device could not read enough bytes"));
+
return __ret;
}