From 42371f7236d24f4de3dfff2a624e47e0c4ef2570 Mon Sep 17 00:00:00 2001 From: Tim Kientzle Date: Fri, 20 Jun 2025 14:33:45 -0700 Subject: [PATCH] Merge pull request #2672 from AZero13/ferror Fix error checking in writing files (cherry picked from commit ffde04f27231cabb91cebcbd7eca08d0f5088dc8) --- libarchive/archive_check_magic.c | 9 ++++++++- libarchive/archive_write_open_fd.c | 2 +- libarchive/archive_write_open_file.c | 14 +++++--------- libarchive/archive_write_open_filename.c | 2 +- 4 files changed, 15 insertions(+), 12 deletions(-) diff --git a/libarchive/archive_check_magic.c b/libarchive/archive_check_magic.c index d12f0c496..6b8e0c559 100644 --- a/libarchive/archive_check_magic.c +++ b/libarchive/archive_check_magic.c @@ -30,6 +30,7 @@ #endif #include +#include #ifdef HAVE_STDLIB_H #include #endif @@ -54,8 +55,14 @@ errmsg(const char *m) while (s > 0) { written = write(2, m, s); - if (written <= 0) + if (written == 0) return; + if (written < 0) + { + if (errno == EINTR) + continue; + return; + } m += written; s -= written; } diff --git a/libarchive/archive_write_open_fd.c b/libarchive/archive_write_open_fd.c index 8a3f68d06..ba034ed92 100644 --- a/libarchive/archive_write_open_fd.c +++ b/libarchive/archive_write_open_fd.c @@ -122,7 +122,7 @@ file_write(struct archive *a, void *client_data, const void *buff, size_t length mine = (struct write_fd_data *)client_data; for (;;) { bytesWritten = write(mine->fd, buff, length); - if (bytesWritten <= 0) { + if (bytesWritten < 0) { if (errno == EINTR) continue; archive_set_error(a, errno, "Write error"); diff --git a/libarchive/archive_write_open_file.c b/libarchive/archive_write_open_file.c index 4c6ebfb22..0b310f3da 100644 --- a/libarchive/archive_write_open_file.c +++ b/libarchive/archive_write_open_file.c @@ -85,16 +85,12 @@ file_write(struct archive *a, void *client_data, const void *buff, size_t length size_t bytesWritten; mine = client_data; - for (;;) { - bytesWritten = fwrite(buff, 1, length, mine->f); - if (bytesWritten <= 0) { - if (errno == EINTR) - continue; - archive_set_error(a, errno, "Write error"); - return (-1); - } - return (bytesWritten); + bytesWritten = fwrite(buff, 1, length, mine->f); + if (bytesWritten != length) { + archive_set_error(a, errno, "Write error"); + return (-1); } + return (bytesWritten); } static int diff --git a/libarchive/archive_write_open_filename.c b/libarchive/archive_write_open_filename.c index 633f7fe17..7d0f9bde1 100644 --- a/libarchive/archive_write_open_filename.c +++ b/libarchive/archive_write_open_filename.c @@ -228,7 +228,7 @@ file_write(struct archive *a, void *client_data, const void *buff, mine = (struct write_file_data *)client_data; for (;;) { bytesWritten = write(mine->fd, buff, length); - if (bytesWritten <= 0) { + if (bytesWritten < 0) { if (errno == EINTR) continue; archive_set_error(a, errno, "Write error"); -- 2.47.3