If the sentinel failed (e.g. due to having reached EOF before) or an exception was caught it failed to do that. The C++14 standard says: "In any case, if n is greater than zero, it then stores a null character (using charT()) into the next successive location of the array." Other implementations like libstdc++ do 0-terminate and not doing so may lead 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.2 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits