[Nouveau] [PATCH 7/7] drm/nouveau: fix and verify __user pointer casts

Pekka Paalanen pq at iki.fi
Sat Aug 8 00:39:02 PDT 2009


On 32-bit arch this fixes compiler warnings about casting an integer of
different size to a pointer.

This also fixes sparse warnings about casting address spaces.

Signed-off-by: Pekka Paalanen <pq at iki.fi>
---
 drivers/gpu/drm/nouveau/nouveau_gem.c |   13 ++++++++-----
 1 files changed, 8 insertions(+), 5 deletions(-)

diff --git a/drivers/gpu/drm/nouveau/nouveau_gem.c b/drivers/gpu/drm/nouveau/nouveau_gem.c
index 4717ced..0dcf391 100644
--- a/drivers/gpu/drm/nouveau/nouveau_gem.c
+++ b/drivers/gpu/drm/nouveau/nouveau_gem.c
@@ -271,11 +271,13 @@ static int
 nouveau_gem_pushbuf_validate(struct nouveau_channel *chan,
 			     struct drm_file *file_priv,
 			     struct drm_nouveau_gem_pushbuf_bo *pbbo,
-			     uint64_t user_bo, int nr_buffers,
+			     uint64_t user_buffers, int nr_buffers,
 			     struct list_head *list, int *apply_relocs)
 {
 	struct drm_device *dev = chan->dev;
 	struct drm_nouveau_gem_pushbuf_bo *b;
+	struct drm_nouveau_gem_pushbuf_bo __user *user_pbbos =
+				(void __force __user *)(uintptr_t)user_buffers;
 	struct nouveau_fence *prev_fence;
 	struct nouveau_bo *nvbo;
 	struct list_head *entry, *tmp;
@@ -358,7 +360,7 @@ retry:
 		     (nvbo->bo.mem.mem_type == TTM_PL_TT &&
 		      b->presumed_domain & NOUVEAU_GEM_DOMAIN_GART))) {
 			b++;
-			user_bo += sizeof(*b);
+			user_pbbos++;
 			continue;
 		}
 
@@ -371,13 +373,13 @@ retry:
 		if (apply_relocs)
 			(*apply_relocs)++;
 
-		if (copy_to_user((void __user *)user_bo, b, sizeof(*b))) {
+		if (copy_to_user(user_pbbos, b, sizeof(*b))) {
 			ret = -EFAULT;
 			goto out_unref;
 		}
 
 		b++;
-		user_bo += sizeof(*b);
+		user_pbbos++;
 	}
 
 out_unref:
@@ -438,12 +440,13 @@ static inline void *
 u_memcpya(uint64_t user, unsigned nmemb, unsigned size)
 {
 	void *mem;
+	void __user *userptr = (void __force __user *)(uintptr_t)user;
 
 	mem = kmalloc(nmemb * size, GFP_KERNEL);
 	if (!mem)
 		return ERR_PTR(-ENOMEM);
 
-	if (copy_from_user(mem, (void __user *)user, nmemb * size)) {
+	if (copy_from_user(mem, userptr, nmemb * size)) {
 		kfree(mem);
 		return ERR_PTR(-EFAULT);
 	}
-- 
1.6.3.3



More information about the Nouveau mailing list