diff options
author | Kristian Høgsberg <krh@redhat.com> | 2009-06-08 17:50:41 +0200 |
---|---|---|
committer | Dave Airlie <airlied@redhat.com> | 2009-06-12 07:37:28 +0200 |
commit | fbe0efb869efde8d847ede3a925230ef88910086 (patch) | |
tree | fb7df90bd25a77555db351a6db632e52aab311e2 /include/drm | |
parent | drm: Eliminate magic I2C frobbing when reading EDID (diff) | |
download | linux-fbe0efb869efde8d847ede3a925230ef88910086.tar.xz linux-fbe0efb869efde8d847ede3a925230ef88910086.zip |
drm_calloc_large: check right size, check integer overflow, use GFP_ZERO
Previously we would check size instead of size * nmemb, and so would
never hit the vmalloc path. Also add integer overflow check as in kcalloc,
and allocate GFP_ZERO pages instead of memset()ing them.
Signed-off-by: Kristian Høgsberg <krh@redhat.com>
Signed-off-by: Dave Airlie <airlied@redhat.com>
Diffstat (limited to 'include/drm')
-rw-r--r-- | include/drm/drmP.h | 12 |
1 files changed, 4 insertions, 8 deletions
diff --git a/include/drm/drmP.h b/include/drm/drmP.h index afc21685230e..1cc51a0812fe 100644 --- a/include/drm/drmP.h +++ b/include/drm/drmP.h @@ -1573,18 +1573,14 @@ static __inline__ void *drm_calloc(size_t nmemb, size_t size, int area) static __inline__ void *drm_calloc_large(size_t nmemb, size_t size) { - u8 *addr; - - if (size <= PAGE_SIZE) + if (size * nmemb <= PAGE_SIZE) return kcalloc(nmemb, size, GFP_KERNEL); - addr = vmalloc(nmemb * size); - if (!addr) + if (size != 0 && nmemb > ULONG_MAX / size) return NULL; - memset(addr, 0, nmemb * size); - - return addr; + return __vmalloc(size * nmemb, + GFP_KERNEL | __GFP_HIGHMEM | __GFP_ZERO, PAGE_KERNEL); } static __inline void drm_free_large(void *ptr) |