Skip to content

Commit 9143d79

Browse files
committed
selftests/landlock: Fix socket file descriptor leaks in audit helpers
audit_init() opens a netlink socket and configures it, but leaks the file descriptor if audit_set_status() or setsockopt() fails. Fix this by jumping to an error path that closes the socket before returning. Apply the same fix to audit_init_with_exe_filter(), which leaks the file descriptor from audit_init() if audit_init_filter_exe() or audit_filter_exe() fails, and to audit_cleanup(), which leaks it if audit_init_filter_exe() fails in FIXTURE_TEARDOWN_PARENT(). Cc: Günther Noack <gnoack@google.com> Cc: stable@vger.kernel.org Fixes: 6a500b2 ("selftests/landlock: Add tests for audit flags and domain IDs") Reviewed-by: Günther Noack <gnoack3000@gmail.com> Link: https://lore.kernel.org/r/20260402192608.1458252-3-mic@digikod.net Signed-off-by: Mickaël Salaün <mic@digikod.net>
1 parent b566f7a commit 9143d79

1 file changed

Lines changed: 19 additions & 7 deletions

File tree

  • tools/testing/selftests/landlock

tools/testing/selftests/landlock/audit.h

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -379,19 +379,25 @@ static int audit_init(void)
379379

380380
err = audit_set_status(fd, AUDIT_STATUS_ENABLED, 1);
381381
if (err)
382-
return err;
382+
goto err_close;
383383

384384
err = audit_set_status(fd, AUDIT_STATUS_PID, getpid());
385385
if (err)
386-
return err;
386+
goto err_close;
387387

388388
/* Sets a timeout for negative tests. */
389389
err = setsockopt(fd, SOL_SOCKET, SO_RCVTIMEO, &audit_tv_default,
390390
sizeof(audit_tv_default));
391-
if (err)
392-
return -errno;
391+
if (err) {
392+
err = -errno;
393+
goto err_close;
394+
}
393395

394396
return fd;
397+
398+
err_close:
399+
close(fd);
400+
return err;
395401
}
396402

397403
static int audit_init_filter_exe(struct audit_filter *filter, const char *path)
@@ -441,8 +447,10 @@ static int audit_cleanup(int audit_fd, struct audit_filter *filter)
441447

442448
filter = &new_filter;
443449
err = audit_init_filter_exe(filter, NULL);
444-
if (err)
450+
if (err) {
451+
close(audit_fd);
445452
return err;
453+
}
446454
}
447455

448456
/* Filters might not be in place. */
@@ -468,11 +476,15 @@ static int audit_init_with_exe_filter(struct audit_filter *filter)
468476

469477
err = audit_init_filter_exe(filter, NULL);
470478
if (err)
471-
return err;
479+
goto err_close;
472480

473481
err = audit_filter_exe(fd, filter, AUDIT_ADD_RULE);
474482
if (err)
475-
return err;
483+
goto err_close;
476484

477485
return fd;
486+
487+
err_close:
488+
close(fd);
489+
return err;
478490
}

0 commit comments

Comments
 (0)