Thread (10 messages) 10 messages, 5 authors, 2021-07-05

Re: [PATCH] Input: joydev - prevent potential write out of bounds in ioctl

flat view

From: Linus Torvalds <torvalds@linux-foundation.org>
Date: 2021-06-20 16:42:01
Also in: lkml

On Sun, Jun 20, 2021 at 5:01 AM Alexander Larkin [off-list ref] wrote:
    The problem is that the check of user input values that is just
    before the fixed line of code is for the part of first values
    (before len or before len/2), but then the usage of all the values
    including i >= len (or i >= len/2) could be.
No, I think the problem is simpler than that.
quoted hunk ↗ jump to hunk
-       for (i = 0; i < joydev->nabs; i++)
+       for (i = 0; i < len && i < joydev->nabs; i++)
                joydev->absmap[joydev->abspam[i]] = i;
This part is unnecessary - all values of "joydev->abspam[i]" have been
validated (either they are the old ones, or the new ones that we just
validated).
quoted hunk ↗ jump to hunk
        memcpy(joydev->keypam, keypam, len);

-       for (i = 0; i < joydev->nkey; i++)
+       for (i = 0; i < (len / 2) && i < joydev->nkey; i++)
                joydev->keymap[keypam[i] - BTN_MISC] = i;
The problem here is not that we walk past "len/2", but that the code
*should* have used

        joydev->keymap[joydev->keypam[i] - BTN_MISC] = i;

(note the "keypam[1]" vs "joydev->keypam[i]").

And the reason it *should* walk the whole "joydev->nkey" is that if
there are later cases with the same keypam value, the later ones
should override the previous ones (well, that "should" is more a
"traditionally have").

So I think the right patch is this one-liner

  diff --git a/drivers/input/joydev.c b/drivers/input/joydev.c
  index da8963a9f044..947d440a3be6 100644
  --- a/drivers/input/joydev.c
  +++ b/drivers/input/joydev.c
  @@ -499,7 +499,7 @@ static int joydev_handle_JSIOCSBTNMAP(struct
joydev *joydev,
        memcpy(joydev->keypam, keypam, len);

        for (i = 0; i < joydev->nkey; i++)
  -             joydev->keymap[keypam[i] - BTN_MISC] = i;
  +             joydev->keymap[joydev->keypam[i] - BTN_MISC] = i;

    out:
        kfree(keypam);

(whitespace-damaged, I would like Dmitry to think about it rather than
apply this mindlessly.

Dmitry?

              Linus
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help