aboutsummaryrefslogtreecommitdiff
path: root/libstdc++-v3/config
diff options
context:
space:
mode:
authorPaolo Carlini <pcarlini@suse.de>2004-08-30 11:33:54 +0000
committerPaolo Carlini <paolo@gcc.gnu.org>2004-08-30 11:33:54 +0000
commitce894603bf0d99149a4f109380b0e6552a24081b (patch)
tree317f2029db735292793cd5a5590314aec48030dc /libstdc++-v3/config
parent28839b70d0fa8703311d39ca2ce1f8a17b8d20d6 (diff)
downloadgcc-ce894603bf0d99149a4f109380b0e6552a24081b.zip
gcc-ce894603bf0d99149a4f109380b0e6552a24081b.tar.gz
gcc-ce894603bf0d99149a4f109380b0e6552a24081b.tar.bz2
re PR libstdc++/17215 ([3.4 only] __basic_file<char>::close ignores errors)
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
Diffstat (limited to 'libstdc++-v3/config')
-rw-r--r--libstdc++-v3/config/io/basic_file_stdio.cc32
1 files changed, 25 insertions, 7 deletions
diff --git a/libstdc++-v3/config/io/basic_file_stdio.cc b/libstdc++-v3/config/io/basic_file_stdio.cc
index a3ed839..680220b 100644
--- a/libstdc++-v3/config/io/basic_file_stdio.cc
+++ b/libstdc++-v3/config/io/basic_file_stdio.cc
@@ -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;
}