Skip to content

Commit

Permalink
LoadPin: Move pin reporting cleanly out of locking
Browse files Browse the repository at this point in the history
Refactor the pin reporting to be more cleanly outside the locking. It
was already, but moving it around helps clear the path for the root to
switch when not enforcing.

Cc: Paul Moore <paul@paul-moore.com>
Cc: James Morris <jmorris@namei.org>
Cc: "Serge E. Hallyn" <serge@hallyn.com>
Cc: linux-security-module@vger.kernel.org
Signed-off-by: Kees Cook <keescook@chromium.org>
Reviewed-by: Serge Hallyn <serge@hallyn.com>
Link: https://lore.kernel.org/r/20221209195746.1366607-3-keescook@chromium.org
  • Loading branch information
Kees Cook committed Jan 19, 2023
1 parent 60ba102 commit 2cfaa84
Showing 1 changed file with 6 additions and 9 deletions.
15 changes: 6 additions & 9 deletions security/loadpin/loadpin.c
Original file line number Diff line number Diff line change
Expand Up @@ -131,6 +131,7 @@ static int loadpin_check(struct file *file, enum kernel_read_file_id id)
{
struct super_block *load_root;
const char *origin = kernel_read_file_id_str(id);
bool first_root_pin = false;
bool load_root_writable;

/* If the file id is excluded, ignore the pinning. */
Expand Down Expand Up @@ -162,18 +163,14 @@ static int loadpin_check(struct file *file, enum kernel_read_file_id id)
*/
if (!pinned_root) {
pinned_root = load_root;
/*
* Unlock now since it's only pinned_root we care about.
* In the worst case, we will (correctly) report pinning
* failures before we have announced that pinning is
* enforcing. This would be purely cosmetic.
*/
spin_unlock(&pinned_root_spinlock);
first_root_pin = true;
}
spin_unlock(&pinned_root_spinlock);

if (first_root_pin) {
report_writable(pinned_root, load_root_writable);
set_sysctl(load_root_writable);
report_load(origin, file, "pinned");
} else {
spin_unlock(&pinned_root_spinlock);
}

if (IS_ERR_OR_NULL(pinned_root) ||
Expand Down

0 comments on commit 2cfaa84

Please sign in to comment.