libreboot-utils: unified errno handling on returns

Signed-off-by: Leah Rowe <leah@libreboot.org>
This commit is contained in:
Leah Rowe
2026-03-28 08:32:27 +00:00
parent 49cac232d8
commit 4ecdadb7a6
5 changed files with 34 additions and 72 deletions
+1
View File
@@ -490,6 +490,7 @@ int try_err(int loop_err, int errval);
*/
void usage(void);
int set_errno(int saved_errno, int fallback);
void err_exit(int nvm_errval, const char *msg, ...);
func_t errhook(func_t ptr); /* hook function for cleanup on err */
const char *getnvmprogname(void);
+7 -29
View File
@@ -62,11 +62,7 @@ same_file(int fd, struct stat *st_old,
return 0;
err_same_file:
if (errno == saved_errno)
errno = ESTALE;
return -1;
return set_errno(saved_errno, ESTALE);
}
void
@@ -155,13 +151,11 @@ fsync_dir(const char *path)
err_fsync_dir:
if (errno == saved_errno)
errno = EIO;
free_and_set_null(&dirbuf);
close_on_eintr(&dirfd);
return -1;
return set_errno(saved_errno, EIO);
}
/* rw_file_exact() - Read perfectly or die
@@ -264,10 +258,7 @@ rw_file_exact(int fd, unsigned char *mem, size_t nrw,
err_rw_file_exact:
if (errno == saved_errno)
errno = EIO;
return -1;
return set_errno(saved_errno, EIO);
}
/* prw() - portable read-write with more
@@ -446,11 +437,7 @@ real_pread_pwrite:
#endif
err_prw:
if (errno == saved_errno)
errno = EIO;
return -1;
return set_errno(saved_errno, EIO);
}
int
@@ -472,10 +459,7 @@ io_args(int fd, void *mem, size_t nrw,
return 0;
err_io_args:
if (errno == saved_errno)
errno = EINVAL;
return -1;
return set_errno(saved_errno, EINVAL);
}
int
@@ -493,10 +477,7 @@ check_file(int fd, struct stat *st)
return 0;
err_is_file:
if (errno == saved_errno)
errno = EINVAL;
return -1;
return set_errno(saved_errno, EINVAL);
}
/* POSIX can say whatever it wants.
@@ -518,10 +499,7 @@ rw_over_nrw(ssize_t r, size_t nrw)
return r;
err_rw_over_nrw:
if (errno == saved_errno)
errno = EIO;
return -1;
return set_errno(saved_errno, EIO);
}
off_t
+5 -12
View File
@@ -439,10 +439,8 @@ gbe_mv(void)
tmp_gbe_bin_exists = 0;
ret_gbe_mv:
if (f->gbe_fd > -1) {
close_on_eintr(&f->gbe_fd);
f->gbe_fd = -1;
if (fsync_dir(f->fname) < 0) {
f->io_err_gbe_bin = 1;
@@ -462,17 +460,12 @@ ret_gbe_mv:
tmp_gbe_bin_exists = 0;
}
if (rval < 0) {
/* if nothing set errno,
* we assume EIO, or we
* use what was set
*/
if (errno == saved_errno)
errno = EIO;
} else {
errno = saved_errno;
}
if (rval >= 0)
goto out;
return set_errno(saved_errno, EIO);
out:
errno = saved_errno;
return rval;
}
+5 -24
View File
@@ -295,11 +295,7 @@ tmpdir_policy(const char *path,
return 0;
err_tmpdir_policy:
if (errno == saved_errno)
errno = EIO;
return -1;
return set_errno(saved_errno, EIO);
}
int
@@ -377,10 +373,7 @@ err_same_dir:
close_on_eintr(&fd_a);
close_on_eintr(&fd_b);
if (errno == saved_errno)
errno = EIO;
return -1;
return set_errno(saved_errno, EIO);
}
/* bypass_all_sticky_checks: if set,
@@ -467,19 +460,15 @@ world_writeable_and_sticky(
goto sticky_hell; /* heaven visa denied */
sticky_heaven:
close_on_eintr(&dirfd);
errno = saved_errno;
return 1;
sticky_hell:
if (errno == saved_errno)
errno = EPERM;
close_on_eintr(&dirfd);
(void) set_errno(saved_errno, EPERM);
return 0;
}
@@ -923,11 +912,7 @@ int secure_file(int *fd,
return 0;
err_demons:
if (errno == saved_errno)
errno = EIO;
return -1;
return set_errno(saved_errno, EIO);
}
int
@@ -1037,9 +1022,5 @@ lock_file(int fd, int flags)
return 0;
err_lock_file:
if (errno == saved_errno)
errno = EIO;
return -1;
return set_errno(saved_errno, EIO);
}
+16 -7
View File
@@ -201,14 +201,10 @@ scatn(ssize_t sc, const char **sv,
errno = saved_errno;
return 0;
err:
if (ct != NULL)
free(ct);
if (size != NULL)
free(size);
if (errno == saved_errno)
errno = EFAULT;
free_and_set_null(&ct);
free_and_set_null((char **)&size);
return -1;
return set_errno(saved_errno, EFAULT);
}
/* strict strcat */
@@ -285,6 +281,19 @@ err:
return -1;
}
/* on functions that return with errno,
* i sometimes have a default fallback,
* which is set if errno wasn't changed,
* under error condition.
*/
int
set_errno(int saved_errno, int fallback)
{
if (errno == saved_errno)
errno = fallback;
return -1;
}
/* the one for nvmutil state is in state.c */
/* this one just exits */
void