Re: [PATCH RESEND] Fix race in process_vm_rw_core

From: Linus Torvalds
Date: Wed Feb 01 2012 - 01:10:34 EST


On Tue, Jan 31, 2012 at 9:53 PM, Christopher Yeoh <cyeoh@xxxxxxxxxxx> wrote:
> +       mm = mm_access(task, PTRACE_MODE_ATTACH);
> +       if (!mm || IS_ERR(mm)) {
> +               if (!mm)
> +                       rc = -EINVAL;
> +               else
> +                       rc = -EPERM;
>                goto put_task_struct;

Btw, do you really want to throw away the error code?

IOW, maybe it should be

rc = IS_ERR(mm) ? PTR_ERR(mm) : -EINVAL;

or something? Instead of forcing the EPERM? And the -EINVAL might be
better off as an ESRCH? I dunno.

Right now mm_access() returns EACCES for a permission problem, not
EPERM. EACCES is the normal filesystem access "Permission denied",
while EPERM is "Operation not permitted". I do agree that EPERM tends
to go with non-filesystem system calls (like ptrace() or sending
signals to a process that you aren't allowed to), so I do agree that
EPERM makes perfect sense within the context of process_vm_rw().

HOWEVER.

mm_access() can actually also return EINTR. Now, admittedly it only
returns that for killable signals, so user applications should never
*see* that, but it's a special-case example of other errors at least
being possible. What if we ever have some situation where we end up
needing a temporary memory allocation and could return ENOMEM?

Right now you turn all errors into EPERM, whether they were really
about permission problems or not. And that just makes be a bit
nervous. I wonder if we wouldn't be better off just returning EACCES
(and any possible future problem) than try so hard to always return
EPERM?

I dunno. I don't have any really *strong* opinion and I see why you do
it, but my gut feel is still that the error number change really does
seem a bit arbitrary.

Linus
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/