Skip to content

Commit

Permalink
drm/i915: Protect against drm_gem_object not being the first member
Browse files Browse the repository at this point in the history
Dave Airlie spotted that we had a potential bug should we ever rearrange
the drm_i915_gem_object so not the base drm_gem_object was not its first
member. He noticed that we often convert the return of
drm_gem_object_lookup() immediately into drm_i915_gem_object and then
check the result for nullity. This is only valid when the base object is
the first member and so the superobject has the same address. Play safe
instead and use the compiler to convert back to the original return
address for sanity testing.

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
  • Loading branch information
Chris Wilson committed Feb 22, 2011
1 parent 548f245 commit c872522
Show file tree
Hide file tree
Showing 5 changed files with 16 additions and 16 deletions.
18 changes: 9 additions & 9 deletions drivers/gpu/drm/i915/i915_gem.c
Original file line number Diff line number Diff line change
Expand Up @@ -506,7 +506,7 @@ i915_gem_pread_ioctl(struct drm_device *dev, void *data,
return ret;

obj = to_intel_bo(drm_gem_object_lookup(dev, file, args->handle));
if (obj == NULL) {
if (&obj->base == NULL) {
ret = -ENOENT;
goto unlock;
}
Expand Down Expand Up @@ -949,7 +949,7 @@ i915_gem_pwrite_ioctl(struct drm_device *dev, void *data,
return ret;

obj = to_intel_bo(drm_gem_object_lookup(dev, file, args->handle));
if (obj == NULL) {
if (&obj->base == NULL) {
ret = -ENOENT;
goto unlock;
}
Expand Down Expand Up @@ -1045,7 +1045,7 @@ i915_gem_set_domain_ioctl(struct drm_device *dev, void *data,
return ret;

obj = to_intel_bo(drm_gem_object_lookup(dev, file, args->handle));
if (obj == NULL) {
if (&obj->base == NULL) {
ret = -ENOENT;
goto unlock;
}
Expand Down Expand Up @@ -1088,7 +1088,7 @@ i915_gem_sw_finish_ioctl(struct drm_device *dev, void *data,
return ret;

obj = to_intel_bo(drm_gem_object_lookup(dev, file, args->handle));
if (obj == NULL) {
if (&obj->base == NULL) {
ret = -ENOENT;
goto unlock;
}
Expand Down Expand Up @@ -1463,7 +1463,7 @@ i915_gem_mmap_gtt_ioctl(struct drm_device *dev, void *data,
return ret;

obj = to_intel_bo(drm_gem_object_lookup(dev, file, args->handle));
if (obj == NULL) {
if (&obj->base == NULL) {
ret = -ENOENT;
goto unlock;
}
Expand Down Expand Up @@ -3331,7 +3331,7 @@ i915_gem_pin_ioctl(struct drm_device *dev, void *data,
return ret;

obj = to_intel_bo(drm_gem_object_lookup(dev, file, args->handle));
if (obj == NULL) {
if (&obj->base == NULL) {
ret = -ENOENT;
goto unlock;
}
Expand Down Expand Up @@ -3382,7 +3382,7 @@ i915_gem_unpin_ioctl(struct drm_device *dev, void *data,
return ret;

obj = to_intel_bo(drm_gem_object_lookup(dev, file, args->handle));
if (obj == NULL) {
if (&obj->base == NULL) {
ret = -ENOENT;
goto unlock;
}
Expand Down Expand Up @@ -3419,7 +3419,7 @@ i915_gem_busy_ioctl(struct drm_device *dev, void *data,
return ret;

obj = to_intel_bo(drm_gem_object_lookup(dev, file, args->handle));
if (obj == NULL) {
if (&obj->base == NULL) {
ret = -ENOENT;
goto unlock;
}
Expand Down Expand Up @@ -3497,7 +3497,7 @@ i915_gem_madvise_ioctl(struct drm_device *dev, void *data,
return ret;

obj = to_intel_bo(drm_gem_object_lookup(dev, file_priv, args->handle));
if (obj == NULL) {
if (&obj->base == NULL) {
ret = -ENOENT;
goto unlock;
}
Expand Down
4 changes: 2 additions & 2 deletions drivers/gpu/drm/i915/i915_gem_execbuffer.c
Original file line number Diff line number Diff line change
Expand Up @@ -677,7 +677,7 @@ i915_gem_execbuffer_relocate_slow(struct drm_device *dev,
for (i = 0; i < count; i++) {
obj = to_intel_bo(drm_gem_object_lookup(dev, file,
exec[i].handle));
if (obj == NULL) {
if (&obj->base == NULL) {
DRM_ERROR("Invalid object handle %d at index %d\n",
exec[i].handle, i);
ret = -ENOENT;
Expand Down Expand Up @@ -1087,7 +1087,7 @@ i915_gem_do_execbuffer(struct drm_device *dev, void *data,

obj = to_intel_bo(drm_gem_object_lookup(dev, file,
exec[i].handle));
if (obj == NULL) {
if (&obj->base == NULL) {
DRM_ERROR("Invalid object handle %d at index %d\n",
exec[i].handle, i);
/* prevent error path from reading uninitialized data */
Expand Down
4 changes: 2 additions & 2 deletions drivers/gpu/drm/i915/i915_gem_tiling.c
Original file line number Diff line number Diff line change
Expand Up @@ -286,7 +286,7 @@ i915_gem_set_tiling(struct drm_device *dev, void *data,
struct drm_i915_gem_object *obj;

obj = to_intel_bo(drm_gem_object_lookup(dev, file, args->handle));
if (obj == NULL)
if (&obj->base == NULL)
return -ENOENT;

if (!i915_tiling_ok(dev,
Expand Down Expand Up @@ -366,7 +366,7 @@ i915_gem_get_tiling(struct drm_device *dev, void *data,
struct drm_i915_gem_object *obj;

obj = to_intel_bo(drm_gem_object_lookup(dev, file, args->handle));
if (obj == NULL)
if (&obj->base == NULL)
return -ENOENT;

mutex_lock(&dev->struct_mutex);
Expand Down
4 changes: 2 additions & 2 deletions drivers/gpu/drm/i915/intel_display.c
Original file line number Diff line number Diff line change
Expand Up @@ -5324,7 +5324,7 @@ static int intel_crtc_cursor_set(struct drm_crtc *crtc,
}

obj = to_intel_bo(drm_gem_object_lookup(dev, file, handle));
if (!obj)
if (&obj->base == NULL)
return -ENOENT;

if (obj->base.size < width * height * 4) {
Expand Down Expand Up @@ -6563,7 +6563,7 @@ intel_user_framebuffer_create(struct drm_device *dev,
int ret;

obj = to_intel_bo(drm_gem_object_lookup(dev, filp, mode_cmd->handle));
if (!obj)
if (&obj->base == NULL)
return ERR_PTR(-ENOENT);

intel_fb = kzalloc(sizeof(*intel_fb), GFP_KERNEL);
Expand Down
2 changes: 1 addition & 1 deletion drivers/gpu/drm/i915/intel_overlay.c
Original file line number Diff line number Diff line change
Expand Up @@ -1156,7 +1156,7 @@ int intel_overlay_put_image(struct drm_device *dev, void *data,

new_bo = to_intel_bo(drm_gem_object_lookup(dev, file_priv,
put_image_rec->bo_handle));
if (!new_bo) {
if (&new_bo->base == NULL) {
ret = -ENOENT;
goto out_free;
}
Expand Down

0 comments on commit c872522

Please sign in to comment.