@@ -821,6 +821,14 @@ typename basic_filebuf<_CharT, _Traits>::int_type basic_filebuf<_CharT, _Traits>
821821
822822template <class _CharT , class _Traits >
823823typename basic_filebuf<_CharT, _Traits>::int_type basic_filebuf<_CharT, _Traits>::overflow (int_type __c) {
824+ auto __failed = [this ]() {
825+ if (this ->pptr () == this ->epptr () + 1 ) {
826+ this ->pbump (-1 ); // lose the character we overflowed above -- we don't really have a
827+ // choice since we couldn't commit the contents of the put area
828+ }
829+ return traits_type::eof ();
830+ };
831+
824832 if (__file_ == nullptr )
825833 return traits_type::eof ();
826834 __write_mode ();
@@ -841,8 +849,9 @@ typename basic_filebuf<_CharT, _Traits>::int_type basic_filebuf<_CharT, _Traits>
841849
842850 if (__always_noconv_) {
843851 size_t __n = static_cast <size_t >(this ->pptr () - this ->pbase ());
844- if (std::fwrite (this ->pbase (), sizeof (char_type), __n, __file_) != __n)
845- return traits_type::eof ();
852+ if (std::fwrite (this ->pbase (), sizeof (char_type), __n, __file_) != __n) {
853+ return __failed ();
854+ }
846855 } else {
847856 if (!__cv_)
848857 std::__throw_bad_cast ();
@@ -854,34 +863,38 @@ typename basic_filebuf<_CharT, _Traits>::int_type basic_filebuf<_CharT, _Traits>
854863 char * __extbuf_end = __extbuf_;
855864 do {
856865 codecvt_base::result __r = __cv_->out (__st_, __b, __p, __end, __extbuf_, __extbuf_ + __ebs_, __extbuf_end);
857- if (__end == __b)
858- return traits_type::eof ();
866+ if (__end == __b) {
867+ return __failed ();
868+ }
859869
860870 // No conversion needed: output characters directly to the file, done.
861871 if (__r == codecvt_base::noconv) {
862872 size_t __n = static_cast <size_t >(__p - __b);
863- if (std::fwrite (__b, 1 , __n, __file_) != __n)
864- return traits_type::eof ();
873+ if (std::fwrite (__b, 1 , __n, __file_) != __n) {
874+ return __failed ();
875+ }
865876 break ;
866877
867878 // Conversion successful: output the converted characters to the file, done.
868879 } else if (__r == codecvt_base::ok) {
869880 size_t __n = static_cast <size_t >(__extbuf_end - __extbuf_);
870- if (std::fwrite (__extbuf_, 1 , __n, __file_) != __n)
871- return traits_type::eof ();
881+ if (std::fwrite (__extbuf_, 1 , __n, __file_) != __n) {
882+ return __failed ();
883+ }
872884 break ;
873885
874886 // Conversion partially successful: output converted characters to the file and repeat with the
875887 // remaining characters.
876888 } else if (__r == codecvt_base::partial) {
877889 size_t __n = static_cast <size_t >(__extbuf_end - __extbuf_);
878- if (std::fwrite (__extbuf_, 1 , __n, __file_) != __n)
879- return traits_type::eof ();
890+ if (std::fwrite (__extbuf_, 1 , __n, __file_) != __n) {
891+ return __failed ();
892+ }
880893 __b = const_cast <char_type*>(__end);
881894 continue ;
882895
883896 } else {
884- return traits_type::eof ();
897+ return __failed ();
885898 }
886899 } while (true );
887900 }
0 commit comments