drm: fix leak of uninitialized data to userspace
authorVegard Nossum <vegard.nossum@gmail.com>
Tue, 2 Dec 2008 03:38:47 +0000 (13:38 +1000)
committerDave Airlie <airlied@linux.ie>
Mon, 29 Dec 2008 07:47:22 +0000 (17:47 +1000)
commit1147c9cdd0f60f09a98702a9f865176af18a989f
tree4f3c33102566475cd145cf0235c1738d07b8b715
parent7c1c2871a6a3a114853ec6836e9035ac1c0c7f7a
drm: fix leak of uninitialized data to userspace

...so drm_getunique() is trying to copy some uninitialized data to
userspace. The ECX register contains the number of words that are
left to copy -- so there are 5 * 4 = 20 bytes left. The offset of the
first uninitialized byte (counting from the start of the string) is
also 20 (i.e. 0xf65d2294&((1 << 5)-1) == 20). So somebody tried to
copy 40 bytes when the string was only 19 long.

In drm_set_busid() we have this code:

        dev->unique_len = 40;
        dev->unique = drm_alloc(dev->unique_len + 1, DRM_MEM_DRIVER);
      ...
        len = snprintf(dev->unique, dev->unique_len, pci:%04x:%02x:%02x.%d",

...so it seems that dev->unique is never updated to reflect the
actual length of the string. The remaining bytes (20 in this case)
are random uninitialized bytes that are copied into userspace.

This patch fixes the problem by setting dev->unique_len after the
snprintf().

airlied- I've had to fix this up to store the alloced size so
we have it for drm_free later.

Reported-by: Sitsofe Wheeler <sitsofe@yahoo.com>
Signed-off-by: Vegard Nossum <vegardno@thuin.ifi.uio.no>
Signed-off-by: Dave Airlie <airlied@redhat.com>
drivers/gpu/drm/drm_ioctl.c
drivers/gpu/drm/drm_stub.c
include/drm/drmP.h