@@ -822,6 +822,14 @@ typename basic_filebuf<_CharT, _Traits>::int_type basic_filebuf<_CharT, _Traits>
822822
823823template <class _CharT , class _Traits >
824824typename basic_filebuf<_CharT, _Traits>::int_type basic_filebuf<_CharT, _Traits>::overflow (int_type __c) {
825+ auto __failed = [this ]() {
826+ if (this ->pptr () == this ->epptr () + 1 ) {
827+ this ->pbump (-1 ); // lose the character we overflowed above -- we don't really have a
828+ // choice since we couldn't commit the contents of the put area
829+ }
830+ return traits_type::eof ();
831+ };
832+
825833 if (__file_ == nullptr )
826834 return traits_type::eof ();
827835 __write_mode ();
@@ -842,8 +850,9 @@ typename basic_filebuf<_CharT, _Traits>::int_type basic_filebuf<_CharT, _Traits>
842850
843851 if (__always_noconv_) {
844852 size_t __n = static_cast <size_t >(this ->pptr () - this ->pbase ());
845- if (std::fwrite (this ->pbase (), sizeof (char_type), __n, __file_) != __n)
846- return traits_type::eof ();
853+ if (std::fwrite (this ->pbase (), sizeof (char_type), __n, __file_) != __n) {
854+ return __failed ();
855+ }
847856 } else {
848857 if (!__cv_)
849858 std::__throw_bad_cast ();
@@ -855,34 +864,38 @@ typename basic_filebuf<_CharT, _Traits>::int_type basic_filebuf<_CharT, _Traits>
855864 char * __extbuf_end = __extbuf_;
856865 do {
857866 codecvt_base::result __r = __cv_->out (__st_, __b, __p, __end, __extbuf_, __extbuf_ + __ebs_, __extbuf_end);
858- if (__end == __b)
859- return traits_type::eof ();
867+ if (__end == __b) {
868+ return __failed ();
869+ }
860870
861871 // No conversion needed: output characters directly to the file, done.
862872 if (__r == codecvt_base::noconv) {
863873 size_t __n = static_cast <size_t >(__p - __b);
864- if (std::fwrite (__b, 1 , __n, __file_) != __n)
865- return traits_type::eof ();
874+ if (std::fwrite (__b, 1 , __n, __file_) != __n) {
875+ return __failed ();
876+ }
866877 break ;
867878
868879 // Conversion successful: output the converted characters to the file, done.
869880 } else if (__r == codecvt_base::ok) {
870881 size_t __n = static_cast <size_t >(__extbuf_end - __extbuf_);
871- if (std::fwrite (__extbuf_, 1 , __n, __file_) != __n)
872- return traits_type::eof ();
882+ if (std::fwrite (__extbuf_, 1 , __n, __file_) != __n) {
883+ return __failed ();
884+ }
873885 break ;
874886
875887 // Conversion partially successful: output converted characters to the file and repeat with the
876888 // remaining characters.
877889 } else if (__r == codecvt_base::partial) {
878890 size_t __n = static_cast <size_t >(__extbuf_end - __extbuf_);
879- if (std::fwrite (__extbuf_, 1 , __n, __file_) != __n)
880- return traits_type::eof ();
891+ if (std::fwrite (__extbuf_, 1 , __n, __file_) != __n) {
892+ return __failed ();
893+ }
881894 __b = const_cast <char_type*>(__end);
882895 continue ;
883896
884897 } else {
885- return traits_type::eof ();
898+ return __failed ();
886899 }
887900 } while (true );
888901 }
0 commit comments