act: use credential guards in acct_write_process()

Use credential guards for scoped credential override with automatic
restoration on scope exit.

Link: https://patch.msgid.link/20251103-work-creds-guards-simple-v1-14-a3e156839e7f@kernel.org
Reviewed-by: Amir Goldstein <amir73il@gmail.com>
Signed-off-by: Christian Brauner <brauner@kernel.org>
This commit is contained in:
Christian Brauner 2025-11-03 12:27:02 +01:00
parent c5c92c624a
commit 5db84abd2a
No known key found for this signature in database
GPG Key ID: 91C61BC06578DCA2
1 changed files with 13 additions and 16 deletions

View File

@ -520,26 +520,23 @@ static void fill_ac(struct bsd_acct_struct *acct)
static void acct_write_process(struct bsd_acct_struct *acct) static void acct_write_process(struct bsd_acct_struct *acct)
{ {
struct file *file = acct->file; struct file *file = acct->file;
const struct cred *cred;
acct_t *ac = &acct->ac; acct_t *ac = &acct->ac;
/* Perform file operations on behalf of whoever enabled accounting */ /* Perform file operations on behalf of whoever enabled accounting */
cred = override_creds(file->f_cred); scoped_with_creds(file->f_cred) {
/*
/* * First check to see if there is enough free_space to continue
* First check to see if there is enough free_space to continue * the process accounting system. Then get freeze protection. If
* the process accounting system. Then get freeze protection. If * the fs is frozen, just skip the write as we could deadlock
* the fs is frozen, just skip the write as we could deadlock * the system otherwise.
* the system otherwise. */
*/ if (check_free_space(acct) && file_start_write_trylock(file)) {
if (check_free_space(acct) && file_start_write_trylock(file)) { /* it's been opened O_APPEND, so position is irrelevant */
/* it's been opened O_APPEND, so position is irrelevant */ loff_t pos = 0;
loff_t pos = 0; __kernel_write(file, ac, sizeof(acct_t), &pos);
__kernel_write(file, ac, sizeof(acct_t), &pos); file_end_write(file);
file_end_write(file); }
} }
revert_creds(cred);
} }
static void do_acct_process(struct bsd_acct_struct *acct) static void do_acct_process(struct bsd_acct_struct *acct)