aboutsummaryrefslogtreecommitdiffstats
path: root/include/drm
diff options
context:
space:
mode:
authorKristian Høgsberg <krh@redhat.com>2009-06-08 11:50:41 -0400
committerDave Airlie <airlied@redhat.com>2009-06-12 01:37:28 -0400
commitfbe0efb869efde8d847ede3a925230ef88910086 (patch)
treefb7df90bd25a77555db351a6db632e52aab311e2 /include/drm
parent61f11699e7a92d932b31ded3715ad4f70eb26ef2 (diff)
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.h12
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)
1573 1573
1574static __inline__ void *drm_calloc_large(size_t nmemb, size_t size) 1574static __inline__ void *drm_calloc_large(size_t nmemb, size_t size)
1575{ 1575{
1576 u8 *addr; 1576 if (size * nmemb <= PAGE_SIZE)
1577
1578 if (size <= PAGE_SIZE)
1579 return kcalloc(nmemb, size, GFP_KERNEL); 1577 return kcalloc(nmemb, size, GFP_KERNEL);
1580 1578
1581 addr = vmalloc(nmemb * size); 1579 if (size != 0 && nmemb > ULONG_MAX / size)
1582 if (!addr)
1583 return NULL; 1580 return NULL;
1584 1581
1585 memset(addr, 0, nmemb * size); 1582 return __vmalloc(size * nmemb,
1586 1583 GFP_KERNEL | __GFP_HIGHMEM | __GFP_ZERO, PAGE_KERNEL);
1587 return addr;
1588} 1584}
1589 1585
1590static __inline void drm_free_large(void *ptr) 1586static __inline void drm_free_large(void *ptr)