diff options
Diffstat (limited to 'libio/wfileops.c')
-rw-r--r-- | libio/wfileops.c | 11 |
1 files changed, 7 insertions, 4 deletions
diff --git a/libio/wfileops.c b/libio/wfileops.c index 87d3cdcf33..877fc1f829 100644 --- a/libio/wfileops.c +++ b/libio/wfileops.c @@ -715,7 +715,7 @@ _IO_wfile_seekoff (fp, offset, dir, mode) - fp->_wide_data->_IO_write_base) / clen; else { - enum __codecvt_result status; + enum __codecvt_result status = __codecvt_ok; delta = (fp->_wide_data->_IO_write_ptr - fp->_wide_data->_IO_write_base); const wchar_t *write_base = fp->_wide_data->_IO_write_base; @@ -728,9 +728,12 @@ _IO_wfile_seekoff (fp, offset, dir, mode) flush buffers for every ftell. */ do { - /* Ugh, no point trying to avoid the flush. Just do it - and go back to how it was with the read mode. */ - if (delta > 0 && new_write_ptr == fp->_IO_buf_end) + /* There is not enough space in the buffer to do the entire + conversion, so there is no point trying to avoid the + buffer flush. Just do it and go back to how it was with + the read mode. */ + if (status == __codecvt_partial + || (delta > 0 && new_write_ptr == fp->_IO_buf_end)) { if (_IO_switch_to_wget_mode (fp)) return WEOF; |