lkml.org 
[lkml]   [2022]   [Jun]   [7]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.18 203/879] char: tpm: cr50_i2c: Suppress duplicated error message in .remove()
    Date
    From: Uwe Kleine-König <u.kleine-koenig@pengutronix.de>

    [ Upstream commit e0687fe958f763f1790f22ed5483025b7624e744 ]

    Returning an error value in an i2c remove callback results in an error
    message being emitted by the i2c core, but otherwise it doesn't make a
    difference. The device goes away anyhow and the devm cleanups are
    called.

    As tpm_cr50_i2c_remove() emits an error message already and the
    additional error message by the i2c core doesn't add any useful
    information, change the return value to zero to suppress this error
    message.

    Note that if i2c_clientdata is NULL, there is something really fishy.
    Assuming no memory corruption happened (then all bets are lost anyhow),
    tpm_cr50_i2c_remove() is only called after tpm_cr50_i2c_probe() returned
    successfully. So there was a tpm chip registered before and after
    tpm_cr50_i2c_remove() its privdata is freed but the associated character
    device isn't removed. If after that happened userspace accesses the
    character device it's likely that the freed memory is accessed. For that
    reason the warning message is made a bit more frightening.

    Signed-off-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de>
    Signed-off-by: Jarkko Sakkinen <jarkko@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    drivers/char/tpm/tpm_tis_i2c_cr50.c | 4 ++--
    1 file changed, 2 insertions(+), 2 deletions(-)

    diff --git a/drivers/char/tpm/tpm_tis_i2c_cr50.c b/drivers/char/tpm/tpm_tis_i2c_cr50.c
    index f6c0affbb456..bf608b6af339 100644
    --- a/drivers/char/tpm/tpm_tis_i2c_cr50.c
    +++ b/drivers/char/tpm/tpm_tis_i2c_cr50.c
    @@ -768,8 +768,8 @@ static int tpm_cr50_i2c_remove(struct i2c_client *client)
    struct device *dev = &client->dev;

    if (!chip) {
    - dev_err(dev, "Could not get client data at remove\n");
    - return -ENODEV;
    + dev_crit(dev, "Could not get client data at remove, memory corruption ahead\n");
    + return 0;
    }

    tpm_chip_unregister(chip);
    --
    2.35.1


    \
     
     \ /
      Last update: 2022-06-08 00:23    [W:2.326 / U:0.164 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site