Re: [PATCH] drm/ast: fix using freed memory

From: Thomas Zimmermann
Date: Thu Feb 10 2022 - 13:55:55 EST


Hi

Am 03.02.22 um 16:23 schrieb trix@xxxxxxxxxx:
From: Tom Rix <trix@xxxxxxxxxx>

clang static analysis reports this problem
ast_mode.c:1235:3: warning: Use of memory after it is freed
drm_connector_update_edid_property(&ast_connector->base, edid);
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

The second condition on

if (!flags && ast_connector->i2c)

Means that the edid is not always set. If the previous block
fails the freed edid value will be used. So set edid to NULL
after freeing.

Thanks for your patch. We have meanwhile merges a change that replaces the code entirely.

Best regards
Thomas


Fixes: 55dc449a7c60 ("drm/ast: Handle failed I2C initialization gracefully")
Signed-off-by: Tom Rix <trix@xxxxxxxxxx>
---
drivers/gpu/drm/ast/ast_mode.c | 6 ++++--
1 file changed, 4 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/ast/ast_mode.c b/drivers/gpu/drm/ast/ast_mode.c
index ab52efb15670e..9131dc8a1a2fc 100644
--- a/drivers/gpu/drm/ast/ast_mode.c
+++ b/drivers/gpu/drm/ast/ast_mode.c
@@ -1224,10 +1224,12 @@ static int ast_get_modes(struct drm_connector *connector)
return -ENOMEM;
flags = ast_dp501_read_edid(connector->dev, (u8 *)edid);
- if (flags)
+ if (flags) {
ast->dp501_maxclk = ast_get_dp501_max_clk(connector->dev);
- else
+ } else {
kfree(edid);
+ edid = NULL;
+ }
}
if (!flags && ast_connector->i2c)
edid = drm_get_edid(connector, &ast_connector->i2c->adapter);

--
Thomas Zimmermann
Graphics Driver Developer
SUSE Software Solutions Germany GmbH
Maxfeldstr. 5, 90409 Nürnberg, Germany
(HRB 36809, AG Nürnberg)
Geschäftsführer: Ivo Totev

Attachment: OpenPGP_signature
Description: OpenPGP digital signature