aboutsummaryrefslogtreecommitdiff
path: root/libcxx
diff options
context:
space:
mode:
authorMarshall Clow <mclow.lists@gmail.com>2016-07-13 16:58:48 +0000
committerMarshall Clow <mclow.lists@gmail.com>2016-07-13 16:58:48 +0000
commit9531bbd7c3c2a4a6b7dcc2e24c13d889d409a797 (patch)
tree4b66a6000c61eab1a8d9595f10edba08434f40f0 /libcxx
parent68c34a083d0c5ae36136b2136d7c986442859100 (diff)
downloadllvm-9531bbd7c3c2a4a6b7dcc2e24c13d889d409a797.zip
llvm-9531bbd7c3c2a4a6b7dcc2e24c13d889d409a797.tar.gz
llvm-9531bbd7c3c2a4a6b7dcc2e24c13d889d409a797.tar.bz2
Constuct a sentry object in istream::readsome, and handle failures appropriately. Fixes PR#28217.
llvm-svn: 275280
Diffstat (limited to 'libcxx')
-rw-r--r--libcxx/include/istream39
1 files changed, 28 insertions, 11 deletions
diff --git a/libcxx/include/istream b/libcxx/include/istream
index 0bcc7ee..ee69400 100644
--- a/libcxx/include/istream
+++ b/libcxx/include/istream
@@ -1251,18 +1251,35 @@ streamsize
basic_istream<_CharT, _Traits>::readsome(char_type* __s, streamsize __n)
{
__gc_ = 0;
- streamsize __c = this->rdbuf()->in_avail();
- switch (__c)
- {
- case -1:
- this->setstate(ios_base::eofbit);
- break;
- case 0:
- break;
- default:
- read(__s, _VSTD::min(__c, __n));
- break;
+#ifndef _LIBCPP_NO_EXCEPTIONS
+ try
+ {
+#endif // _LIBCPP_NO_EXCEPTIONS
+ sentry __sen(*this, true);
+ if (__sen)
+ {
+ streamsize __c = this->rdbuf()->in_avail();
+ switch (__c)
+ {
+ case -1:
+ this->setstate(ios_base::eofbit);
+ break;
+ case 0:
+ break;
+ default:
+ read(__s, _VSTD::min(__c, __n));
+ break;
+ }
+ }
+ else
+ this->setstate(ios_base::failbit);
+#ifndef _LIBCPP_NO_EXCEPTIONS
}
+ catch (...)
+ {
+ this->__set_badbit_and_consider_rethrow();
+ }
+#endif // _LIBCPP_NO_EXCEPTIONS
return __gc_;
}