diff options
Diffstat (limited to 'libio/wfileops.c')
-rw-r--r-- | libio/wfileops.c | 13 |
1 files changed, 8 insertions, 5 deletions
diff --git a/libio/wfileops.c b/libio/wfileops.c index 0a156eaad4..877fc1f829 100644 --- a/libio/wfileops.c +++ b/libio/wfileops.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1993-2013 Free Software Foundation, Inc. +/* Copyright (C) 1993-2014 Free Software Foundation, Inc. This file is part of the GNU C Library. Written by Ulrich Drepper <drepper@cygnus.com>. Based on the single byte version by Per Bothner <bothner@cygnus.com>. @@ -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; |