Hi Alexander,

On 06/06/26 09:38, Alexander A. Klimov wrote:
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]>

Applied to drm/misc/kernel (drm-misc-fixes).

Best Regards,
- Maíra

---
  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++;

Reply via email to