Quoting Andrew G. Morgan ([EMAIL PROTECTED]):
> -----BEGIN PGP SIGNED MESSAGE-----
> Hash: SHA1
>
>
>
> [EMAIL PROTECTED] wrote:
> | Quoting Andrew G. Morgan ([EMAIL PROTECTED]):
> | Here is my latest per-process secure-bits patch.
> |
> |> Hey Andrew,
> |
> |> looks really good.  Two comments inline.
>
> Thanks for the review!
>
> - -   unsigned keep_capabilities:1;
> +     unsigned securebits;
>
> | should this maybe be an unsigned short?
>
> I'm not sure what this would buy us. Given the placement in the data
> structure its going to end up aligned by the surrounding data types and
> will occupy at least a sizeof(unsigned) amount of space even if we
> declare it as a short. Could you clarify why you think a short would be
> better?

Is that true on all architectures?  I figured there must be some
architecture where it isn't, but if not then never mind.

>
> +     case PR_GET_KEEPCAPS:
> +             if (issecure(SECURE_KEEP_CAPS))
> +                     error = 1;
> +             break;
> +     case PR_SET_KEEPCAPS:
> +             if ((arg2 > 1) && !issecure(SECURE_KEEP_CAPS_LOCKED))
>
> | I don't understand what you're doing here.  If I had to guess, I'd say
> | you're only enforcing a check on a valid arg2 (which is 0 or 1) only if
> | SECURE_KEEP_CAPS_LOCKED is not set since otherwise the value you can't
> | be changed?  But you don't enforce that so it can in fact be changed,
> | and even if you did this seems to give the user poor feedback in more 
> than
> | one case, so it seems nicer to do
>
> I think the long and the short of it was that I clearly got distracted
> when writing that code! It didn't help that all of my testing was with
> the PR_*_SECUREBITS prctl()... What I had meant to write was this:
>
>       case PR_SET_KEEPCAPS:
>               /* Note, we rely on arg2 being unsigned here: */
>               if ((arg2 > 1) || issecure(SECURE_KEEP_CAPS_LOCKED))
>                       error = -EINVAL;
>               else
>                       current->securebits
>                               = (current->securebits
>                                  & ~issecure_mask(SECURE_KEEP_CAPS))
>                               | (arg2 << SECURE_KEEP_CAPS);
>               break;
>
> |             if (arg2 > 1)
> |                     return -EINVAL;
> |             if (issecure(SECURE_KEEP_CAPS_LOCKED))
> |                     return -EPERM;
>
> +                     error = -EINVAL;
> +             else
> +                     current->securebits
> +                             = (current->securebits
> +                                & ~issecure_mask(SECURE_KEEP_CAPS))
> +                             | (arg2 * issecure_mask(SECURE_KEEP_CAPS));
>
> | Seems overly baroque, and since you're not checking arg2>1 if
> | SECURE_KEEP_CAPS_LOCKED was set, this could actually set a wrong bit
> | with the multiplication.  After the above checks a simple
>
> |             if (arg2)
> |                     current->securebits |= issecure_mask(SECURE_KEEP_CAPS);
> |             else
> |                     current->securebits &= ~issecure_mask(SECURE_KEEP_CAPS);
>
> | would be much easier to read...
>
> I agree. Both that -EPERM is a better error for the locked case, and the
> subsequent if / else. So, I'll use that.

thanks,
-serge
-
To unsubscribe from this list: send the line "unsubscribe 
linux-security-module" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to