All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] drm/dumb-buffers: Integer overflow in drm_mode_create_ioctl()
@ 2018-05-09  7:22 ` Dan Carpenter
  0 siblings, 0 replies; 24+ messages in thread
From: Dan Carpenter @ 2018-05-09  7:22 UTC (permalink / raw)
  To: Gustavo Padovan, David Herrmann; +Cc: David Airlie, kernel-janitors, dri-devel

There is a comment here which says that DIV_ROUND_UP() and that's where
the problem comes from.  Say you pick:

	args->bpp = UINT_MAX - 7;
	args->width = 4;
	args->height = 1;

The integer overflow in DIV_ROUND_UP() means "cpp" is UINT_MAX / 8 and
because of how we picked args->width that means cpp < UINT_MAX / 4.

Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com>
---
Btw, DIV_ROUND_UP() integer overflows have been a recurring source of
bugs so I have an unreleased static checker warning specific for that.
This line triggers three warnings for me on my unreleased code:

drivers/gpu/drm/drm_dumb_buffers.c:69 drm_mode_create_dumb_ioctl() warn: negative user subtract: 0-u32max - 1
drivers/gpu/drm/drm_dumb_buffers.c:69 drm_mode_create_dumb_ioctl() warn: potential integer overflow from user '(args->bpp) + (8)'
drivers/gpu/drm/drm_dumb_buffers.c:69 drm_mode_create_dumb_ioctl() warn: potential integer overflow in 'DIV_ROUND_UP'

It's a pretty common idiom in the kernel to overflow and then test for
it later so I'm not able to release this code because of the number of
false positives that this idiom causes...

diff --git a/drivers/gpu/drm/drm_dumb_buffers.c b/drivers/gpu/drm/drm_dumb_buffers.c
index 39ac15ce4702..45b0b5bbb5f8 100644
--- a/drivers/gpu/drm/drm_dumb_buffers.c
+++ b/drivers/gpu/drm/drm_dumb_buffers.c
@@ -65,7 +65,8 @@ int drm_mode_create_dumb_ioctl(struct drm_device *dev,
 		return -EINVAL;
 
 	/* overflow checks for 32bit size calculations */
-	/* NOTE: DIV_ROUND_UP() can overflow */
+	if (args->bpp > UINT_MAX - 8)
+		return -EINVAL;
 	cpp = DIV_ROUND_UP(args->bpp, 8);
 	if (!cpp || cpp > 0xffffffffU / args->width)
 		return -EINVAL;

^ permalink raw reply related	[flat|nested] 24+ messages in thread

end of thread, other threads:[~2018-05-16 15:57 UTC | newest]

Thread overview: 24+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-05-09  7:22 [PATCH] drm/dumb-buffers: Integer overflow in drm_mode_create_ioctl() Dan Carpenter
2018-05-09  7:22 ` Dan Carpenter
2018-05-09  8:12 ` [PATCH v2] " Dan Carpenter
2018-05-09  8:12   ` Dan Carpenter
2018-05-09  8:18   ` Chris Wilson
2018-05-09  8:18     ` Chris Wilson
2018-05-09 11:59     ` Dan Carpenter
2018-05-09 11:59       ` Dan Carpenter
2018-05-16 14:00     ` Dan Carpenter
2018-05-16 14:00       ` Dan Carpenter
2018-05-16 14:26       ` Chris Wilson
2018-05-16 14:26         ` Chris Wilson
2018-05-16 14:52         ` Dan Carpenter
2018-05-16 14:52           ` Dan Carpenter
2018-05-16 14:56           ` Chris Wilson
2018-05-16 15:15             ` Dan Carpenter
2018-05-16 15:15               ` Dan Carpenter
2018-05-16 15:25               ` Chris Wilson
2018-05-16 15:41               ` Dan Carpenter
2018-05-16 15:41                 ` Dan Carpenter
2018-05-16 15:57       ` Daniel Vetter
2018-05-16 15:57         ` Daniel Vetter
2018-05-09  8:23 ` [PATCH] " Daniel Vetter
2018-05-09  8:23   ` Daniel Vetter

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.