After an interrupted fclose() we can't know if it's safe (or undefined behaviour) to re-use the FILE*, so we shouldn't try calling fclose again.
PR libstdc++/65411 * config/io/basic_file_stdio.cc (__basic_file<char>::close()): Don't retry fclose on EINTR. Tested x86_64-linux, committed to trunk.
commit 852ab4a7f7619036ddf2d7263a40368c351ff19c Author: Jonathan Wakely <jwak...@redhat.com> Date: Fri Jan 13 17:25:06 2017 +0000 PR65411 don't retry fclose on EINTR PR libstdc++/65411 * config/io/basic_file_stdio.cc (__basic_file<char>::close()): Don't retry fclose on EINTR. diff --git a/libstdc++-v3/config/io/basic_file_stdio.cc b/libstdc++-v3/config/io/basic_file_stdio.cc index a0ad82c..e736701 100644 --- a/libstdc++-v3/config/io/basic_file_stdio.cc +++ b/libstdc++-v3/config/io/basic_file_stdio.cc @@ -267,16 +267,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION { int __err = 0; if (_M_cfile_created) - { - // In general, no need to zero errno in advance if checking - // for error first. However, C89/C99 (at variance with IEEE - // 1003.1, f.i.) do not mandate that fclose must set errno - // upon error. - errno = 0; - do - __err = fclose(_M_cfile); - while (__err && errno == EINTR); - } + __err = fclose(_M_cfile); _M_cfile = 0; if (!__err) __ret = this;