Re: [PATCH v3 4/5] mm: Add a NO_INHERIT flag to the PR_SET_MDWE prctl

From: Catalin Marinas
Date: Sun Aug 27 2023 - 09:12:10 EST


On Tue, Jul 04, 2023 at 05:36:28PM +0200, Florent Revest wrote:
> static inline int prctl_set_mdwe(unsigned long bits, unsigned long arg3,
> unsigned long arg4, unsigned long arg5)
> {
> + unsigned long current_bits;
> +
> if (arg3 || arg4 || arg5)
> return -EINVAL;
>
> - if (bits & ~(PR_MDWE_REFUSE_EXEC_GAIN))
> + if (bits & ~(PR_MDWE_REFUSE_EXEC_GAIN | PR_MDWE_NO_INHERIT))
> + return -EINVAL;
> +
> + /* NO_INHERIT only makes sense with REFUSE_EXEC_GAIN */
> + if (bits & PR_MDWE_NO_INHERIT && !(bits & PR_MDWE_REFUSE_EXEC_GAIN))
> return -EINVAL;
>
> + current_bits = get_current_mdwe();
> + if (current_bits && current_bits != bits)
> + return -EPERM; /* Cannot unset the flags */
> +
> + if (bits & PR_MDWE_NO_INHERIT)
> + set_bit(MMF_HAS_MDWE_NO_INHERIT, &current->mm->flags);
> if (bits & PR_MDWE_REFUSE_EXEC_GAIN)
> set_bit(MMF_HAS_MDWE, &current->mm->flags);
> - else if (test_bit(MMF_HAS_MDWE, &current->mm->flags))
> - return -EPERM; /* Cannot unset the flag */
>
> return 0;
> }

This works for me, it's easier to read. I don't expect a use-case where
the app starts with MDWE no-inherit, forks some new processes and wants
to turn inherit on for further forking.

> @@ -2384,9 +2406,7 @@ static inline int prctl_get_mdwe(unsigned long arg2, unsigned long arg3,
> {
> if (arg2 || arg3 || arg4 || arg5)
> return -EINVAL;
> -
> - return test_bit(MMF_HAS_MDWE, &current->mm->flags) ?
> - PR_MDWE_REFUSE_EXEC_GAIN : 0;
> + return (int)get_current_mdwe();

Nitpick: the type conversion should be handled by the compiler as
prctl_get_mdwe() returns an int already.

Reviewed-by: Catalin Marinas <catalin.marinas@xxxxxxx>