summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLeah Rowe <leah@libreboot.org>2026-04-01 21:00:50 +0100
committerLeah Rowe <leah@libreboot.org>2026-04-01 21:05:08 +0100
commit63ec707698d956b50e4d16d5364dd8bc7ad83ddb (patch)
tree489f66b045e15e893bb8e37e74938b817db8c517
parent2d69d45e26a0156cbafdff76c97ddb54cfe3f9e4 (diff)
lbutils/file: ignore close err if errno is EINTRHEADmaster
but DONT LOOP IT. see comment. Signed-off-by: Leah Rowe <leah@libreboot.org>
-rw-r--r--util/libreboot-utils/lib/file.c24
1 files changed, 22 insertions, 2 deletions
diff --git a/util/libreboot-utils/lib/file.c b/util/libreboot-utils/lib/file.c
index a788d4af..efc23ba9 100644
--- a/util/libreboot-utils/lib/file.c
+++ b/util/libreboot-utils/lib/file.c
@@ -717,9 +717,29 @@ xclose(int *fd)
if (*fd < 0)
return;
+ /* nuance regarding EINTR on close():
+ * EINTR can be set on error, but there's
+ * no guarantee whether the fd is then still
+ * open or closed. on some other commands, we
+ * loop EINTR, but for close, we instead skip
+ * aborting *if the errno is EINTR* - so don't
+ * loop it, but do regard EINTR with rval -1
+ * as essenitally a successful close()
+ */
+
+ /* because we don't want to mess with someone
+ * elses file if that fd is then reassigned.
+ * if the operation truly did fail, we ignore
+ * it. just leave it flying in the wind */
+
errno = 0;
- if ((rval = close(*fd)) < 0)
- exitf("xclose: could not close");
+ if ((rval = close(*fd)) < 0) {
+ if (errno != EINTR)
+ exitf("xclose: could not close");
+
+ /* regard EINTR as a successful close */
+ rval = 0;
+ }
*fd = -1;