diff options
| author | Mark Yao <mark.yao@rock-chips.com> | 2015-09-23 00:34:34 -0400 |
|---|---|---|
| committer | Mark Yao <mark.yao@rock-chips.com> | 2016-01-20 20:14:05 -0500 |
| commit | e3c4abdb3bc9b76bedd416ecc5c27633a2f8afed (patch) | |
| tree | 08a8d1c55b554360c44dee4adb50c7e0ef2d43cb | |
| parent | c9ad1d9946e849ac3d8821d91e136d7fd728dec5 (diff) | |
drm/rockchip: fix wrong pitch/size using on gem
args->pitch and args->size may not be set by userspace, sometimes
userspace only malloc args and not memset args to zero, then
args->pitch and args->size is random, it is very danger to use
pitch/size on gem.
pitch's type is u32, and min_pitch's type is int, example,
pitch is 0xffffffff, then pitch < min_pitch return true, then gem will
alloc very very big bufffer, it would eat all the memory and cause kernel
crash.
Stop using pitch/size from args, calc them from other args.
Signed-off-by: Mark Yao <mark.yao@rock-chips.com>
| -rw-r--r-- | drivers/gpu/drm/rockchip/rockchip_drm_gem.c | 9 |
1 files changed, 2 insertions, 7 deletions
diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_gem.c b/drivers/gpu/drm/rockchip/rockchip_drm_gem.c index d908321b94ce..18e07338c6e5 100644 --- a/drivers/gpu/drm/rockchip/rockchip_drm_gem.c +++ b/drivers/gpu/drm/rockchip/rockchip_drm_gem.c | |||
| @@ -234,13 +234,8 @@ int rockchip_gem_dumb_create(struct drm_file *file_priv, | |||
| 234 | /* | 234 | /* |
| 235 | * align to 64 bytes since Mali requires it. | 235 | * align to 64 bytes since Mali requires it. |
| 236 | */ | 236 | */ |
| 237 | min_pitch = ALIGN(min_pitch, 64); | 237 | args->pitch = ALIGN(min_pitch, 64); |
| 238 | 238 | args->size = args->pitch * args->height; | |
| 239 | if (args->pitch < min_pitch) | ||
| 240 | args->pitch = min_pitch; | ||
| 241 | |||
| 242 | if (args->size < args->pitch * args->height) | ||
| 243 | args->size = args->pitch * args->height; | ||
| 244 | 239 | ||
| 245 | rk_obj = rockchip_gem_create_with_handle(file_priv, dev, args->size, | 240 | rk_obj = rockchip_gem_create_with_handle(file_priv, dev, args->size, |
| 246 | &args->handle); | 241 | &args->handle); |
