re PR libstdc++/17215 ([3.4 only] __basic_file<char>::close ignores errors)
authorPaolo Carlini <pcarlini@suse.de>
Mon, 30 Aug 2004 11:33:54 +0000 (11:33 +0000)
committerPaolo Carlini <paolo@gcc.gnu.org>
Mon, 30 Aug 2004 11:33:54 +0000 (11:33 +0000)
2004-08-30  Paolo Carlini  <pcarlini@suse.de>
    Kenneth C. Schalk  <ken@xorian.net>

PR libstdc++/17215
* config/io/basic_file_stdio.cc (__basic_file<char>::close()):
Check the return value of fclose/sync, loop on EINTR.
(__basic_file<char>::sys_open): Likewise, for sync.

Co-Authored-By: Kenneth C. Schalk <ken@xorian.net>
From-SVN: r86756

libstdc++-v3/ChangeLog
libstdc++-v3/config/io/basic_file_stdio.cc

index c7d3ba658f37fa055781e36104340418f78c2d1b..42385c2c422fa0f0e0f1655a0ceef3b67499628a 100644 (file)
@@ -1,3 +1,11 @@
+2004-08-30  Paolo Carlini  <pcarlini@suse.de>
+           Kenneth C. Schalk  <ken@xorian.net>
+
+       PR libstdc++/17215
+       * config/io/basic_file_stdio.cc (__basic_file<char>::close()):
+       Check the return value of fclose/sync, loop on EINTR.
+       (__basic_file<char>::sys_open): Likewise, for sync.
+
 2004-08-29  Paolo Carlini  <pcarlini@suse.de>
 
        * include/bits/locale_facets.tcc (time_get<>::_M_extract_via_format,
index a3ed8391bfffa194bd2aee22e00e2450850832be..680220bc4c582766c76e35bb1c20217a4b99b5b7 100644 (file)
@@ -189,10 +189,17 @@ namespace std
     __basic_file* __ret = NULL;
     if (!this->is_open() && __file)
       {
-       _M_cfile = __file;
-       _M_cfile_created = false;
-       this->sync();
-       __ret = this;
+       int __err;
+       errno = 0;      
+       do
+         __err = this->sync();
+       while (__err && errno == EINTR);
+       if (!__err)
+         {
+           _M_cfile = __file;
+           _M_cfile_created = false;
+           __ret = this;
+         }
       }
     return __ret;
   }
@@ -252,12 +259,23 @@ namespace std
     __basic_file* __ret = static_cast<__basic_file*>(NULL);
     if (this->is_open())
       {
+       // 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/fflush must set
+       // errno upon error.
+       int __err;
+       errno = 0;
        if (_M_cfile_created)
-         fclose(_M_cfile);
+         do
+           __err = fclose(_M_cfile);
+         while (__err && errno == EINTR);
        else
-         this->sync();
+         do
+           __err = this->sync();
+         while (__err && errno == EINTR);
+       if (!__err)
+         __ret = this;
        _M_cfile = 0;
-       __ret = this;
       }
     return __ret;
   }