Don't just overwrite the original pointer passed to krealloc()
with its return value without checking latter:

    MEM = krealloc(MEM, SZ, GFP);

If krealloc() returns NULL, that erases the pointer
to the still allocated memory, hence leaks this memory.
Instead, use a temporary variable, check it's not NULL
and only then assign it to the original pointer:

    TMP = krealloc(MEM, SZ, GFP);
    if (!TMP) return;
    MEM = TMP;

While on it, use krealloc_array().

Fixes: 6d45c81d229d ("drm/vc4: Add support for branching in shader validation.")
Signed-off-by: Alexander A. Klimov <[email protected]>
---
 v2: Declare the variable explicitly
 v2: Instead of void *, use u32 *
 v2: While on it, enhance variable name
 v3: Use krealloc_array()

 [✓] scripts/checkpatch.pl --strict
 [✓] allmodconfig compiled (i686, LLVM)
 [✓] localyesconfig booted (IBM T43)

 Note to myself: use 
--in-reply-to=e1edeadb7c161580a5cd5c7e642dc1b28db8ee86.ca...@perches.com

 drivers/gpu/drm/vc4/vc4_validate_shaders.c | 13 +++++++------
 1 file changed, 7 insertions(+), 6 deletions(-)

diff --git a/drivers/gpu/drm/vc4/vc4_validate_shaders.c 
b/drivers/gpu/drm/vc4/vc4_validate_shaders.c
index d48cf76983c0..66502a6a4a8e 100644
--- a/drivers/gpu/drm/vc4/vc4_validate_shaders.c
+++ b/drivers/gpu/drm/vc4/vc4_validate_shaders.c
@@ -290,15 +290,16 @@ static bool require_uniform_address_uniform(struct 
vc4_validated_shader_info *va
 {
        uint32_t o = validated_shader->num_uniform_addr_offsets;
        uint32_t num_uniforms = validated_shader->uniforms_size / 4;
+       u32 *offsets;
 
-       validated_shader->uniform_addr_offsets =
-               krealloc(validated_shader->uniform_addr_offsets,
-                        (o + 1) *
-                        sizeof(*validated_shader->uniform_addr_offsets),
-                        GFP_KERNEL);
-       if (!validated_shader->uniform_addr_offsets)
+       offsets = krealloc_array(validated_shader->uniform_addr_offsets,
+                                o + 1,
+                                
sizeof(*validated_shader->uniform_addr_offsets),
+                                GFP_KERNEL);
+       if (!offsets)
                return false;
 
+       validated_shader->uniform_addr_offsets = offsets;
        validated_shader->uniform_addr_offsets[o] = num_uniforms;
        validated_shader->num_uniform_addr_offsets++;
 
-- 
2.54.0

Reply via email to