summaryrefslogtreecommitdiff
path: root/util
diff options
context:
space:
mode:
authorLeah Rowe <leah@libreboot.org>2026-04-01 17:43:43 +0100
committerLeah Rowe <leah@libreboot.org>2026-04-01 17:43:43 +0100
commit736a2504bbe1014fc2804c311e10b72826a71b74 (patch)
tree9817b918ea51d671a283042dbd814940f0d97f17 /util
parent249ae57c295c94f4d244251bf5639be305ab2528 (diff)
lbutils/file: don't loop EINTR on close()
state is undefined after EINTR. just abort universally. Signed-off-by: Leah Rowe <leah@libreboot.org>
Diffstat (limited to 'util')
-rw-r--r--util/libreboot-utils/include/common.h2
-rw-r--r--util/libreboot-utils/lib/file.c21
-rw-r--r--util/libreboot-utils/lib/io.c8
-rw-r--r--util/libreboot-utils/lib/mkhtemp.c24
-rw-r--r--util/libreboot-utils/lib/rand.c4
-rw-r--r--util/libreboot-utils/nvmutil.c4
6 files changed, 30 insertions, 33 deletions
diff --git a/util/libreboot-utils/include/common.h b/util/libreboot-utils/include/common.h
index de643402..7d566d70 100644
--- a/util/libreboot-utils/include/common.h
+++ b/util/libreboot-utils/include/common.h
@@ -525,7 +525,7 @@ int secure_file(int *fd,
int check_seek,
int do_lock,
mode_t mode);
-void close_on_eintr(int *fd);
+void xclose(int *fd);
int fsync_on_eintr(int fd);
int fs_rename_at(int olddirfd, const char *old,
int newdirfd, const char *new);
diff --git a/util/libreboot-utils/lib/file.c b/util/libreboot-utils/lib/file.c
index 9af3b89e..862e82cc 100644
--- a/util/libreboot-utils/lib/file.c
+++ b/util/libreboot-utils/lib/file.c
@@ -110,7 +110,7 @@ fsync_dir(const char *path)
if_err_sys((rval = fsync_on_eintr(dirfd)) == -1))
goto err_fsync_dir;
- close_on_eintr(&dirfd);
+ xclose(&dirfd);
free_and_set_null(&dirbuf);
reset_caller_errno(rval);
@@ -118,7 +118,7 @@ fsync_dir(const char *path)
err_fsync_dir:
free_and_set_null(&dirbuf);
- close_on_eintr(&dirfd);
+ xclose(&dirfd);
return with_fallback_errno(EIO);
}
@@ -419,7 +419,7 @@ fs_resolve_at(int dirfd, const char *path, int flags)
/* close previous fd if not the original input */
if (curfd != dirfd)
- close_on_eintr(&curfd);
+ xclose(&curfd);
curfd = nextfd;
nextfd = -1;
@@ -432,11 +432,11 @@ err:
saved_errno = errno;
if (nextfd >= 0)
- close_on_eintr(&nextfd);
+ xclose(&nextfd);
/* close curfd only if it's not the original */
if (curfd != dirfd && curfd >= 0)
- close_on_eintr(&curfd);
+ xclose(&curfd);
errno = saved_errno;
return with_fallback_errno(EIO);
@@ -721,22 +721,19 @@ fsync_on_eintr(int fd)
}
void
-close_on_eintr(int *fd)
+xclose(int *fd)
{
int saved_errno = errno;
int rval = 0;
if (fd == NULL)
- exitf("close_on_eintr: null pointer");
+ exitf("xclose: null pointer");
if (*fd < 0)
return;
errno = 0;
- while (fs_retry(saved_errno,
- rval = close(*fd)));
-
- if (rval < 0)
- exitf("close_on_eintr: could not close");
+ if ((rval = close(*fd)) < 0)
+ exitf("xclose: could not close");
*fd = -1;
diff --git a/util/libreboot-utils/lib/io.c b/util/libreboot-utils/lib/io.c
index 801d4c53..5a1b121d 100644
--- a/util/libreboot-utils/lib/io.c
+++ b/util/libreboot-utils/lib/io.c
@@ -251,8 +251,8 @@ write_to_gbe_bin(void)
saved_errno = errno;
- close_on_eintr(&f->tmp_fd);
- close_on_eintr(&f->gbe_fd);
+ xclose(&f->tmp_fd);
+ xclose(&f->gbe_fd);
errno = saved_errno;
@@ -437,7 +437,7 @@ gbe_mv(void)
tmp_gbe_bin_exists = 0;
if (f->gbe_fd > -1) {
- close_on_eintr(&f->gbe_fd);
+ xclose(&f->gbe_fd);
if (fsync_dir(f->fname) < 0) {
f->io_err_gbe_bin = 1;
@@ -445,7 +445,7 @@ gbe_mv(void)
}
}
- close_on_eintr(&f->tmp_fd);
+ xclose(&f->tmp_fd);
/* before this function is called,
* tmp_fd may have been moved
diff --git a/util/libreboot-utils/lib/mkhtemp.c b/util/libreboot-utils/lib/mkhtemp.c
index 461bb438..8591e817 100644
--- a/util/libreboot-utils/lib/mkhtemp.c
+++ b/util/libreboot-utils/lib/mkhtemp.c
@@ -134,7 +134,7 @@ new_tmp_common(int *fd, char **path, int type,
if (*fd < 0)
goto err;
- close_on_eintr(&dirfd);
+ xclose(&dirfd);
errno = saved_errno;
*path = dest;
@@ -145,8 +145,8 @@ new_tmp_common(int *fd, char **path, int type,
err:
free_and_set_null(&dest);
- close_on_eintr(&dirfd);
- close_on_eintr(fd);
+ xclose(&dirfd);
+ xclose(fd);
/* where a TMPDIR isn't found, and we err,
* we pass this back through for the
@@ -290,8 +290,8 @@ success_same_dir:
rval = 1; /* SUCCESS */
}
- close_on_eintr(&fd_a);
- close_on_eintr(&fd_b);
+ xclose(&fd_a);
+ xclose(&fd_b);
/* we reset caller errno regardless
* of success, so long as it's not
@@ -303,8 +303,8 @@ success_same_dir:
err_same_dir:
/* FAILURE (probably syscall) - returns -1
*/
- close_on_eintr(&fd_a);
- close_on_eintr(&fd_b);
+ xclose(&fd_a);
+ xclose(&fd_b);
return with_fallback_errno(EIO); /* -1 */
}
@@ -359,12 +359,12 @@ sticky_heaven:
if (faccessat(dirfd, ".", X_OK, AT_EACCESS) < 0)
goto sticky_hell; /* down you go! */
- close_on_eintr(&dirfd);
+ xclose(&dirfd);
reset_caller_errno(0);
return 1;
sticky_hell:
- close_on_eintr(&dirfd);
+ xclose(&dirfd);
(void) with_fallback_errno(EPERM);
return 0;
}
@@ -495,7 +495,7 @@ mkhtemp(int *fd,
errno = EEXIST;
err:
- close_on_eintr(fd);
+ xclose(fd);
free_and_set_null(&fname_copy);
return with_fallback_errno(EIO);
@@ -635,7 +635,7 @@ out:
reset_caller_errno(0);
return rval;
err:
- close_on_eintr(fd);
+ xclose(fd);
if (file_created)
(void) unlinkat(dirfd, fname_copy, 0);
@@ -721,7 +721,7 @@ err:
if (linked)
(void) unlinkat(dirfd, fname_copy, 0);
- close_on_eintr(&tmpfd);
+ xclose(&tmpfd);
return with_fallback_errno(EIO);
out:
reset_caller_errno(0);
diff --git a/util/libreboot-utils/lib/rand.c b/util/libreboot-utils/lib/rand.c
index 249e2e6c..153798f6 100644
--- a/util/libreboot-utils/lib/rand.c
+++ b/util/libreboot-utils/lib/rand.c
@@ -176,7 +176,7 @@ retry_rand: {
rc == 0) { /* prevent infinite loop on fatal err */
#if defined(USE_URANDOM) && \
((USE_URANDOM) > 0)
- close_on_eintr(&fd);
+ xclose(&fd);
#endif
goto err;
}
@@ -186,7 +186,7 @@ retry_rand: {
#if defined(USE_URANDOM) && \
((USE_URANDOM) > 0)
- close_on_eintr(&fd);
+ xclose(&fd);
#endif
}
diff --git a/util/libreboot-utils/nvmutil.c b/util/libreboot-utils/nvmutil.c
index ee20e851..66e47ec8 100644
--- a/util/libreboot-utils/nvmutil.c
+++ b/util/libreboot-utils/nvmutil.c
@@ -108,8 +108,8 @@ exit_cleanup(void)
f = &x->f;
/* close fds if still open */
- close_on_eintr(&f->tmp_fd);
- close_on_eintr(&f->gbe_fd);
+ xclose(&f->tmp_fd);
+ xclose(&f->gbe_fd);
/* unlink tmpfile if it exists */
if (f->tname != NULL) {