Found by GCC14 -Wanalyzer-fd-double-close. close always closes the given file descriptor even on error. So don't try to close a file descriptor again on error (even on EINTR). This could be bad in a multi-threaded environment.
* src/ar.c (do_oper_extract): Call close and set newfd to -1. (do_oper_delete): Likewise. (do_oper_insert): Likewise. * src/ranlib.c (handle_file): Likewise. Signed-off-by: Mark Wielaard <m...@klomp.org> --- src/ar.c | 12 ++++++------ src/ranlib.c | 4 ++-- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/ar.c b/src/ar.c index fcb8bfb90a9f..9ace28b918d3 100644 --- a/src/ar.c +++ b/src/ar.c @@ -808,9 +808,9 @@ cannot rename temporary file to %.*s"), if (fchown (newfd, st.st_uid, st.st_gid) != 0) { ; } /* Set the mode of the new file to the same values the original file has. */ - if (fchmod (newfd, st.st_mode & ALLPERMS) != 0 - || close (newfd) != 0) + if (fchmod (newfd, st.st_mode & ALLPERMS) != 0) goto nonew_unlink; + close (newfd); newfd = -1; if (rename (tmpfname, arfname) != 0) goto nonew_unlink; @@ -1061,9 +1061,9 @@ do_oper_delete (const char *arfname, char **argv, int argc, setting the mode (which might be reset/ignored if the owner is wrong. */ if (fchown (newfd, st.st_uid, st.st_gid) != 0) { ; } - if (fchmod (newfd, st.st_mode & ALLPERMS) != 0 - || close (newfd) != 0) + if (fchmod (newfd, st.st_mode & ALLPERMS) != 0) goto nonew_unlink; + close (newfd); newfd = -1; if (rename (tmpfname, arfname) != 0) goto nonew_unlink; @@ -1547,9 +1547,9 @@ do_oper_insert (int oper, const char *arfname, char **argv, int argc, setting the modes, or they might be reset/ignored if the owner is wrong. */ if (fchown (newfd, st.st_uid, st.st_gid) != 0) { ; } - if (fchmod (newfd, st.st_mode & ALLPERMS) != 0 - || close (newfd) != 0) + if (fchmod (newfd, st.st_mode & ALLPERMS) != 0) goto nonew_unlink; + close (newfd); newfd = -1; if (rename (tmpfname, arfname) != 0) goto nonew_unlink; diff --git a/src/ranlib.c b/src/ranlib.c index 7838d69eaec6..073df8c551af 100644 --- a/src/ranlib.c +++ b/src/ranlib.c @@ -264,9 +264,9 @@ handle_file (const char *fname) if (fchown (newfd, st.st_uid, st.st_gid) != 0) { ; } /* Set the mode of the new file to the same values the original file has. */ - if (fchmod (newfd, st.st_mode & ALLPERMS) != 0 - || close (newfd) != 0) + if (fchmod (newfd, st.st_mode & ALLPERMS) != 0) goto nonew_unlink; + close (newfd); newfd = -1; if (rename (tmpfname, fname) != 0) goto nonew_unlink; -- 2.45.2