diff options
| author | Leah Rowe <leah@libreboot.org> | 2026-04-01 17:43:43 +0100 |
|---|---|---|
| committer | Leah Rowe <leah@libreboot.org> | 2026-04-01 17:43:43 +0100 |
| commit | 736a2504bbe1014fc2804c311e10b72826a71b74 (patch) | |
| tree | 9817b918ea51d671a283042dbd814940f0d97f17 /util | |
| parent | 249ae57c295c94f4d244251bf5639be305ab2528 (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.h | 2 | ||||
| -rw-r--r-- | util/libreboot-utils/lib/file.c | 21 | ||||
| -rw-r--r-- | util/libreboot-utils/lib/io.c | 8 | ||||
| -rw-r--r-- | util/libreboot-utils/lib/mkhtemp.c | 24 | ||||
| -rw-r--r-- | util/libreboot-utils/lib/rand.c | 4 | ||||
| -rw-r--r-- | util/libreboot-utils/nvmutil.c | 4 |
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) { |
