If the sentinel failed (e.g. due to having reached EOF before) or an exception was caught it failed to do that. While it seems (unfortunately!) not required by the specification, libstdc++ does 0-terminate and not doing so risks creating security issues in applications. --- include/istream | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)
diff --git a/include/istream b/include/istream index 0b8e05d95..5c73df38f 100644 --- a/include/istream +++ b/include/istream @@ -1069,16 +1069,18 @@ basic_istream<_CharT, _Traits>::getline(char_type* __s, streamsize __n, char_typ this->rdbuf()->sbumpc(); ++__gc_; } - if (__n > 0) - *__s = char_type(); if (__gc_ == 0) __err |= ios_base::failbit; this->setstate(__err); } + if (__n > 0) + *__s = char_type(); #ifndef _LIBCPP_NO_EXCEPTIONS } catch (...) { + if (__n > 0) + *__s = char_type(); this->__set_badbit_and_consider_rethrow(); } #endif // _LIBCPP_NO_EXCEPTIONS -- 2.14.1 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits