diff options
author | Jerry Quinn <jlquinn@optonline.net> | 2003-03-07 14:14:11 +0000 |
---|---|---|
committer | Jerry Quinn <jlquinn@gcc.gnu.org> | 2003-03-07 14:14:11 +0000 |
commit | 53279c104fa23673379a9b8226486795672ecaae (patch) | |
tree | 25cff5182a787e32d4f8cdd84649260989f1232b | |
parent | 37f74dcf9524c4b9bfeead32c66f541a16b19121 (diff) | |
download | gcc-53279c104fa23673379a9b8226486795672ecaae.zip gcc-53279c104fa23673379a9b8226486795672ecaae.tar.gz gcc-53279c104fa23673379a9b8226486795672ecaae.tar.bz2 |
streambuf_iterator.h (_M_put): Set _M_failed if sputn fails.
2003-03-07 Jerry Quinn <jlquinn@optonline.net>
* include/bits/streambuf_iterator.h (_M_put): Set _M_failed if
sputn fails.
* testsuite/27_io/ostream_fail.cc: New test.
From-SVN: r63944
-rw-r--r-- | libstdc++-v3/ChangeLog | 6 | ||||
-rw-r--r-- | libstdc++-v3/include/bits/streambuf_iterator.h | 4 | ||||
-rw-r--r-- | libstdc++-v3/testsuite/27_io/ostream_fail.cc | 53 |
3 files changed, 62 insertions, 1 deletions
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index 2f9b0ff..2162fc8 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,9 @@ +2003-03-07 Jerry Quinn <jlquinn@optonline.net> + + * 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 <doko@debian.org> * 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 c2dee88..95def0b 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 0000000..77b29ea --- /dev/null +++ b/libstdc++-v3/testsuite/27_io/ostream_fail.cc @@ -0,0 +1,53 @@ +// 2003-02-24 Petur Runolfsson <peturr02 at ru dot is> + +// 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 <ostream> +#include <streambuf> +#include <testsuite_hooks.h> + +// 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; +} |