From 70d8a4555ac0c246eceed1ae84ae08c9141134bd Mon Sep 17 00:00:00 2001 From: ajesh Date: Wed, 19 Jun 2019 22:10:32 +0530 Subject: [PATCH] gpu: nvgpu: fix CERTC violations in kmem unit INT30-C Requires that unsigned integer operations do not wrap. INT31-C Requires that integer conversions do not result in lost or misinterpreted data. ERR33-C Requires to detect and handle standard library errors. Fix the above CERT C violations in kmem unit. Jira NVGPU-3603 Change-Id: I104551406e3cf6d2da22c5b6c6edc6694992ce62 Signed-off-by: ajesh Reviewed-on: https://git-master.nvidia.com/r/2139529 Reviewed-by: Automatic_Commit_Validation_User Reviewed-by: svc-mobile-coverity Reviewed-by: svc-mobile-misra GVS: Gerrit_Virtual_Submit Reviewed-by: Nitin Kumbhar Reviewed-by: mobile promotions Tested-by: mobile promotions --- drivers/gpu/nvgpu/os/posix/kmem.c | 46 +++++++++++++++++++++++++++---- 1 file changed, 41 insertions(+), 5 deletions(-) diff --git a/drivers/gpu/nvgpu/os/posix/kmem.c b/drivers/gpu/nvgpu/os/posix/kmem.c index 8c2edb507..8f24e46c9 100644 --- a/drivers/gpu/nvgpu/os/posix/kmem.c +++ b/drivers/gpu/nvgpu/os/posix/kmem.c @@ -72,7 +72,7 @@ struct nvgpu_kmem_cache *nvgpu_kmem_cache_create(struct gk20a *g, size_t size) cache->size = size; (void)snprintf(cache->name, sizeof(cache->name), - "nvgpu-cache-0x%p-%d-%d", g, (int)size, + "nvgpu-cache-0x%p-%lu-%d", g, size, nvgpu_atomic_inc_return(&kmem_cache_id)); return cache; @@ -85,12 +85,21 @@ void nvgpu_kmem_cache_destroy(struct nvgpu_kmem_cache *cache) void *nvgpu_kmem_cache_alloc(struct nvgpu_kmem_cache *cache) { + void *ptr; + #ifdef NVGPU_UNITTEST_FAULT_INJECTION_ENABLEMENT if (nvgpu_posix_fault_injection_handle_call(&kmem_fi)) { return NULL; } #endif - return malloc(cache->size); + ptr = malloc(cache->size); + + if (ptr == NULL) { + nvgpu_warn(NULL, "malloc returns NULL"); + return NULL; + } + + return ptr; } void nvgpu_kmem_cache_free(struct nvgpu_kmem_cache *cache, void *ptr) @@ -100,6 +109,8 @@ void nvgpu_kmem_cache_free(struct nvgpu_kmem_cache *cache, void *ptr) void *nvgpu_kmalloc_impl(struct gk20a *g, size_t size, void *ip) { + void *ptr; + #ifdef NVGPU_UNITTEST_FAULT_INJECTION_ENABLEMENT if (nvgpu_posix_fault_injection_handle_call(&kmem_fi)) { return NULL; @@ -112,27 +123,52 @@ void *nvgpu_kmalloc_impl(struct gk20a *g, size_t size, void *ip) * nvmap_page_alloc in qnx (i.e. using shm_open/shm_ctl_special/mmap * calls). */ - return malloc(size); + ptr = malloc(size); + + if (ptr == NULL) { + nvgpu_warn(NULL, "malloc returns NULL"); + return NULL; + } + + return ptr; } void *nvgpu_kzalloc_impl(struct gk20a *g, size_t size, void *ip) { + void *ptr; + #ifdef NVGPU_UNITTEST_FAULT_INJECTION_ENABLEMENT if (nvgpu_posix_fault_injection_handle_call(&kmem_fi)) { return NULL; } #endif - return calloc(1, size); + ptr = calloc(1, size); + + if (ptr == NULL) { + nvgpu_warn(NULL, "calloc returns NULL"); + return NULL; + } + + return ptr; } void *nvgpu_kcalloc_impl(struct gk20a *g, size_t n, size_t size, void *ip) { + void *ptr; + #ifdef NVGPU_UNITTEST_FAULT_INJECTION_ENABLEMENT if (nvgpu_posix_fault_injection_handle_call(&kmem_fi)) { return NULL; } #endif - return calloc(1, n * size); + ptr = calloc(1, (nvgpu_safe_mult_u64(n, size))); + + if (ptr == NULL) { + nvgpu_warn(NULL, "calloc returns NULL"); + return NULL; + } + + return ptr; } void *nvgpu_vmalloc_impl(struct gk20a *g, unsigned long size, void *ip)