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
This commit is contained in:
parent
28839b70d0
commit
ce894603bf
@ -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,
|
||||
|
@ -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;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user