From: Tim Kientzle Date: Fri, 20 Jun 2025 21:33:45 +0000 (-0700) Subject: Merge pull request #2672 from AZero13/ferror X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=42371f7236d24f4de3dfff2a624e47e0c4ef2570;p=thirdparty%2Flibarchive.git Merge pull request #2672 from AZero13/ferror Fix error checking in writing files (cherry picked from commit ffde04f27231cabb91cebcbd7eca08d0f5088dc8) --- 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");