]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
Check the result of dirfd() before calling unlinkat()
authorOndřej Surý <ondrej@isc.org>
Thu, 15 Aug 2024 07:23:31 +0000 (09:23 +0200)
committerOndřej Surý <ondrej@isc.org>
Mon, 19 Aug 2024 11:23:05 +0000 (11:23 +0000)
Instead of directly using the result of dirfd() in the unlinkat() call,
check whether the returned file descriptor is actually valid.  That
doesn't really change the logic as the unlinkat() would fail with
invalid descriptor anyway, but this is cleaner and will report the right
error returned directly by dirfd() instead of EBADF from unlinkat().

(cherry picked from commit 59f4fdebc07441a5c7419488990f4b82c6a22eeb)

lib/isc/log.c

index 523fd2d6bb5bc5cc712fcfff24942274bf48b982..b18edaa7fe2b1064b3901f38481c8d3b0782aefc 100644 (file)
@@ -1076,8 +1076,10 @@ greatest_version(isc_logfile_t *file, int versions, int *greatestp) {
                         * Remove any backup files that exceed versions.
                         */
                        if (*digit_end == '\0' && version >= versions) {
-                               int n = unlinkat(dirfd(dir.handle),
-                                                dir.entry.name, 0);
+                               int n = dirfd(dir.handle);
+                               if (n >= 0) {
+                                       n = unlinkat(n, dir.entry.name, 0);
+                               }
                                if (n < 0) {
                                        result = isc_errno_toresult(errno);
                                        if (result != ISC_R_SUCCESS &&
@@ -1223,8 +1225,10 @@ remove_old_tsversions(isc_logfile_t *file, int versions) {
                         * Remove any backup files that exceed versions.
                         */
                        if (*digit_end == '\0' && version < last) {
-                               int n = unlinkat(dirfd(dir.handle),
-                                                dir.entry.name, 0);
+                               int n = dirfd(dir.handle);
+                               if (n >= 0) {
+                                       n = unlinkat(n, dir.entry.name, 0);
+                               }
                                if (n < 0) {
                                        result = isc_errno_toresult(errno);
                                        if (result != ISC_R_SUCCESS &&