mirror of
https://codeberg.org/libreboot/lbmk.git
synced 2026-07-21 10:12:04 +02:00
util/nvmutil: more portable close()
close may set errno to EINTR, which could cause weird edge case behaviour in our prw() functtion Signed-off-by: Leah Rowe <leah@libreboot.org>
This commit is contained in:
+31
-18
@@ -142,7 +142,7 @@
|
|||||||
* codebase would allow me to write a separate C
|
* codebase would allow me to write a separate C
|
||||||
* program to test some finer intricacies
|
* program to test some finer intricacies
|
||||||
* TODO: the unit tests would basically test regressions
|
* TODO: the unit tests would basically test regressions
|
||||||
* TODO: after writing back a gbe to file, close() and
|
* TODO: after writing back a gbe to file, x_i_close() and
|
||||||
* open() it again, read it again, and check that
|
* open() it again, read it again, and check that
|
||||||
* the contents were written correctly, providing
|
* the contents were written correctly, providing
|
||||||
* a warning if they were. do this in the main
|
* a warning if they were. do this in the main
|
||||||
@@ -478,6 +478,7 @@ static int x_i_mkstemp(char *template);
|
|||||||
static char *x_c_strrchr(const char *s, int c);
|
static char *x_c_strrchr(const char *s, int c);
|
||||||
static int x_i_rename(const char *src, const char *dst);
|
static int x_i_rename(const char *src, const char *dst);
|
||||||
static char *x_c_tmpdir(void);
|
static char *x_c_tmpdir(void);
|
||||||
|
static int x_i_close(int fd);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Sizes in bytes:
|
* Sizes in bytes:
|
||||||
@@ -1813,12 +1814,12 @@ write_to_gbe_bin(void)
|
|||||||
|
|
||||||
saved_errno = errno;
|
saved_errno = errno;
|
||||||
|
|
||||||
if (close(tmp_fd) == -1) {
|
if (x_i_close(tmp_fd) == -1) {
|
||||||
fprintf(stderr, "FAIL: %s: close\n", tname);
|
fprintf(stderr, "FAIL: %s: close\n", tname);
|
||||||
io_err_gbe_bin = 1;
|
io_err_gbe_bin = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (close(gbe_fd) == -1) {
|
if (x_i_close(gbe_fd) == -1) {
|
||||||
fprintf(stderr, "FAIL: %s: close\n", fname);
|
fprintf(stderr, "FAIL: %s: close\n", fname);
|
||||||
io_err_gbe_bin = 1;
|
io_err_gbe_bin = 1;
|
||||||
}
|
}
|
||||||
@@ -2035,7 +2036,7 @@ gbe_mv(void)
|
|||||||
|
|
||||||
sync();
|
sync();
|
||||||
|
|
||||||
if (close(dest_fd) == -1)
|
if (x_i_close(dest_fd) == -1)
|
||||||
goto ret_gbe_mv;
|
goto ret_gbe_mv;
|
||||||
|
|
||||||
if (x_i_rename(dest_tmp, fname) == -1)
|
if (x_i_rename(dest_tmp, fname) == -1)
|
||||||
@@ -2050,7 +2051,7 @@ gbe_mv(void)
|
|||||||
ret_gbe_mv:
|
ret_gbe_mv:
|
||||||
|
|
||||||
if (gbe_fd > -1) {
|
if (gbe_fd > -1) {
|
||||||
if (close(gbe_fd) < 0)
|
if (x_i_close(gbe_fd) < 0)
|
||||||
r = -1;
|
r = -1;
|
||||||
if (fsync_dir(fname) < 0)
|
if (fsync_dir(fname) < 0)
|
||||||
r = -1;
|
r = -1;
|
||||||
@@ -2058,7 +2059,7 @@ ret_gbe_mv:
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (tmp_fd > -1) {
|
if (tmp_fd > -1) {
|
||||||
if (close(tmp_fd) < 0)
|
if (x_i_close(tmp_fd) < 0)
|
||||||
r = -1;
|
r = -1;
|
||||||
|
|
||||||
tmp_fd = -1;
|
tmp_fd = -1;
|
||||||
@@ -2149,7 +2150,7 @@ fsync_dir(const char *path)
|
|||||||
|
|
||||||
sync();
|
sync();
|
||||||
|
|
||||||
if (close(dfd) == -1)
|
if (x_i_close(dfd) == -1)
|
||||||
goto err_fsync_dir;
|
goto err_fsync_dir;
|
||||||
|
|
||||||
if (dirbuf != NULL)
|
if (dirbuf != NULL)
|
||||||
@@ -2169,7 +2170,7 @@ err_fsync_dir:
|
|||||||
free(dirbuf);
|
free(dirbuf);
|
||||||
|
|
||||||
if (dfd > -1)
|
if (dfd > -1)
|
||||||
close(dfd);
|
x_i_close(dfd);
|
||||||
|
|
||||||
io_err_gbe_bin = 1;
|
io_err_gbe_bin = 1;
|
||||||
errno = saved_errno;
|
errno = saved_errno;
|
||||||
@@ -2758,13 +2759,13 @@ exit_cleanup(void)
|
|||||||
int saved_errno = errno;
|
int saved_errno = errno;
|
||||||
|
|
||||||
if (gbe_fd > -1) {
|
if (gbe_fd > -1) {
|
||||||
if (close(gbe_fd) == -1)
|
if (x_i_close(gbe_fd) == -1)
|
||||||
close_err = 1;
|
close_err = 1;
|
||||||
gbe_fd = -1;
|
gbe_fd = -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (tmp_fd > -1) {
|
if (tmp_fd > -1) {
|
||||||
if (close(tmp_fd) == -1)
|
if (x_i_close(tmp_fd) == -1)
|
||||||
close_err = 1;
|
close_err = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2997,7 +2998,7 @@ err_new_tmpfile:
|
|||||||
free(dest);
|
free(dest);
|
||||||
|
|
||||||
if (fd_tmp > -1)
|
if (fd_tmp > -1)
|
||||||
close(fd_tmp);
|
x_i_close(fd_tmp);
|
||||||
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
@@ -3054,29 +3055,29 @@ x_i_rename(const char *src, const char *dst)
|
|||||||
|
|
||||||
dfd = open(dst, O_WRONLY | O_CREAT | O_TRUNC, 0600);
|
dfd = open(dst, O_WRONLY | O_CREAT | O_TRUNC, 0600);
|
||||||
if (dfd < 0) {
|
if (dfd < 0) {
|
||||||
close(sfd);
|
x_i_close(sfd);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
while ((r = read(sfd, buf, sizeof(buf))) > 0) {
|
while ((r = read(sfd, buf, sizeof(buf))) > 0) {
|
||||||
ssize_t w = write(dfd, buf, r);
|
ssize_t w = write(dfd, buf, r);
|
||||||
if (w != r) {
|
if (w != r) {
|
||||||
close(sfd);
|
x_i_close(sfd);
|
||||||
close(dfd);
|
x_i_close(dfd);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (r < 0) {
|
if (r < 0) {
|
||||||
close(sfd);
|
x_i_close(sfd);
|
||||||
close(dfd);
|
x_i_close(dfd);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
sync();
|
sync();
|
||||||
|
|
||||||
close(sfd);
|
x_i_close(sfd);
|
||||||
close(dfd);
|
x_i_close(dfd);
|
||||||
|
|
||||||
if (unlink(src) < 0)
|
if (unlink(src) < 0)
|
||||||
return -1;
|
return -1;
|
||||||
@@ -3104,3 +3105,15 @@ x_c_tmpdir(void)
|
|||||||
|
|
||||||
return ".";
|
return ".";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
x_i_close(int fd)
|
||||||
|
{
|
||||||
|
int r;
|
||||||
|
|
||||||
|
do {
|
||||||
|
r = close(fd);
|
||||||
|
} while (r == -1 && errno == EINTR);
|
||||||
|
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user