@@ -821,6 +821,14 @@ typename basic_filebuf<_CharT, _Traits>::int_type basic_filebuf<_CharT, _Traits>
821
821
822
822
template <class _CharT , class _Traits >
823
823
typename 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
+
824
832
if (__file_ == nullptr )
825
833
return traits_type::eof ();
826
834
__write_mode ();
@@ -841,8 +849,9 @@ typename basic_filebuf<_CharT, _Traits>::int_type basic_filebuf<_CharT, _Traits>
841
849
842
850
if (__always_noconv_) {
843
851
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
+ }
846
855
} else {
847
856
if (!__cv_)
848
857
std::__throw_bad_cast ();
@@ -854,34 +863,38 @@ typename basic_filebuf<_CharT, _Traits>::int_type basic_filebuf<_CharT, _Traits>
854
863
char * __extbuf_end = __extbuf_;
855
864
do {
856
865
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
+ }
859
869
860
870
// No conversion needed: output characters directly to the file, done.
861
871
if (__r == codecvt_base::noconv) {
862
872
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
+ }
865
876
break ;
866
877
867
878
// Conversion successful: output the converted characters to the file, done.
868
879
} else if (__r == codecvt_base::ok) {
869
880
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
+ }
872
884
break ;
873
885
874
886
// Conversion partially successful: output converted characters to the file and repeat with the
875
887
// remaining characters.
876
888
} else if (__r == codecvt_base::partial) {
877
889
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
+ }
880
893
__b = const_cast <char_type*>(__end);
881
894
continue ;
882
895
883
896
} else {
884
- return traits_type::eof ();
897
+ return __failed ();
885
898
}
886
899
} while (true );
887
900
}
0 commit comments