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;

Reply via email to