diff options
author | Paolo Carlini <pcarlini@suse.de> | 2004-08-30 11:33:54 +0000 |
---|---|---|
committer | Paolo Carlini <paolo@gcc.gnu.org> | 2004-08-30 11:33:54 +0000 |
commit | ce894603bf0d99149a4f109380b0e6552a24081b (patch) | |
tree | 317f2029db735292793cd5a5590314aec48030dc /libstdc++-v3/config | |
parent | 28839b70d0fa8703311d39ca2ce1f8a17b8d20d6 (diff) | |
download | gcc-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.cc | 32 |
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; } |