mirror of
https://github.com/systemd/systemd.git
synced 2026-08-05 07:30:30 +00:00
util: ignore kernel errors reported via close(), unless it is EBADF
The kernel can return pretty much anything there, even though the fd is closed. Let's not get confused by that.
This commit is contained in:
Notes:
Lennart Poettering
2014-05-24 11:23:45 +08:00
Backport: bugfix
@@ -166,19 +166,19 @@ int close_nointr(int fd) {
|
||||
|
||||
assert(fd >= 0);
|
||||
r = close(fd);
|
||||
|
||||
/* Just ignore EINTR; a retry loop is the wrong
|
||||
* thing to do on Linux.
|
||||
*
|
||||
* http://lkml.indiana.edu/hypermail/linux/kernel/0509.1/0877.html
|
||||
* https://bugzilla.gnome.org/show_bug.cgi?id=682819
|
||||
* http://utcc.utoronto.ca/~cks/space/blog/unix/CloseEINTR
|
||||
* https://sites.google.com/site/michaelsafyan/software-engineering/checkforeintrwheninvokingclosethinkagain
|
||||
*/
|
||||
if (_unlikely_(r < 0 && errno == EINTR))
|
||||
return 0;
|
||||
else if (r >= 0)
|
||||
if (r >= 0)
|
||||
return r;
|
||||
else if (errno == EINTR)
|
||||
/*
|
||||
* Just ignore EINTR; a retry loop is the wrong
|
||||
* thing to do on Linux.
|
||||
*
|
||||
* http://lkml.indiana.edu/hypermail/linux/kernel/0509.1/0877.html
|
||||
* https://bugzilla.gnome.org/show_bug.cgi?id=682819
|
||||
* http://utcc.utoronto.ca/~cks/space/blog/unix/CloseEINTR
|
||||
* https://sites.google.com/site/michaelsafyan/software-engineering/checkforeintrwheninvokingclosethinkagain
|
||||
*/
|
||||
return 0;
|
||||
else
|
||||
return -errno;
|
||||
}
|
||||
@@ -195,7 +195,13 @@ int safe_close(int fd) {
|
||||
|
||||
if (fd >= 0) {
|
||||
PROTECT_ERRNO;
|
||||
assert_se(close_nointr(fd) == 0);
|
||||
|
||||
/* The kernel might return pretty much any error code
|
||||
* via close(), but the fd will be closed anyway. The
|
||||
* only condition we want to check for here is whether
|
||||
* the fd was invalid at all... */
|
||||
|
||||
assert_se(close_nointr(fd) != -EBADF);
|
||||
}
|
||||
|
||||
return -1;
|
||||
|
||||
Reference in New Issue
Block a user