[9.20] fix: dev: Check the result of dirfd() before calling unlinkat()

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().

Closes #4853

Backport of MR !9316

Merge branch 'backport-4853-check-result-of-dirfd-in-isc_log-9.20' into 'bind-9.20'

See merge request isc-projects/bind9!9343
This commit is contained in:
Ondřej Surý 2024-08-19 11:49:29 +00:00
commit 335796f32a

View file

@ -1037,8 +1037,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 &&
@ -1184,8 +1186,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 &&