diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index 2f9b0ff6085..2162fc8e70a 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,9 @@ +2003-03-07 Jerry Quinn + + * include/bits/streambuf_iterator.h (_M_put): Set _M_failed if + sputn fails. + * testsuite/27_io/ostream_fail.cc: New test. + 2003-03-07 Matthias Klose * Makefile.am (AM_MAKEFLAGS): Also pass gxx_include_dir. diff --git a/libstdc++-v3/include/bits/streambuf_iterator.h b/libstdc++-v3/include/bits/streambuf_iterator.h index c2dee887c4b..95def0b7e4d 100644 --- a/libstdc++-v3/include/bits/streambuf_iterator.h +++ b/libstdc++-v3/include/bits/streambuf_iterator.h @@ -202,7 +202,9 @@ namespace std ostreambuf_iterator& _M_put(const _CharT* __ws, streamsize __len) { - this->_M_sbuf->sputn(__ws, __len); + if (__builtin_expect(!_M_failed, true) + && __builtin_expect(this->_M_sbuf->sputn(__ws, __len) != __len, false)) + _M_failed = true; return *this; } }; diff --git a/libstdc++-v3/testsuite/27_io/ostream_fail.cc b/libstdc++-v3/testsuite/27_io/ostream_fail.cc new file mode 100644 index 00000000000..77b29eab635 --- /dev/null +++ b/libstdc++-v3/testsuite/27_io/ostream_fail.cc @@ -0,0 +1,53 @@ +// 2003-02-24 Petur Runolfsson + +// Copyright (C) 2003 Free Software Foundation, Inc. +// +// This file is part of the GNU ISO C++ Library. This library is free +// software; you can redistribute it and/or modify it under the +// terms of the GNU General Public License as published by the +// Free Software Foundation; either version 2, or (at your option) +// any later version. + +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License along +// with this library; see the file COPYING. If not, write to the Free +// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, +// USA. + +#include +#include +#include + +// libstdc++/9827 +class Buf : public std::streambuf +{ +}; + +bool test01() +{ + using namespace std; + bool test = true; + + Buf buf; + ostream stream (&buf); + + stream << 1; + VERIFY(!stream.good()); + +#ifdef DEBUG_ASSERT + assert(test); +#endif + + return test; +} + + +int main() +{ + test01(); + return 0; +}