Skip to content

Commit

Permalink
i2c: smbus: kill memory leak on emulated and failed DMA SMBus xfers
Browse files Browse the repository at this point in the history
If DMA safe memory was allocated, but the subsequent I2C transfer
fails the memory is leaked. Plug this leak.

Fixes: 8a77821 ("i2c: smbus: use DMA safe buffers for emulated SMBus transactions")
Signed-off-by: Peter Rosin <[email protected]>
Signed-off-by: Wolfram Sang <[email protected]>
Cc: [email protected]
  • Loading branch information
peda-r authored and Wolfram Sang committed Jun 29, 2018
1 parent 2173ed0 commit 9aa6136
Showing 1 changed file with 9 additions and 5 deletions.
14 changes: 9 additions & 5 deletions drivers/i2c/i2c-core-smbus.c
Original file line number Diff line number Diff line change
Expand Up @@ -465,15 +465,18 @@ static s32 i2c_smbus_xfer_emulated(struct i2c_adapter *adapter, u16 addr,

status = i2c_transfer(adapter, msg, num);
if (status < 0)
return status;
if (status != num)
return -EIO;
goto cleanup;
if (status != num) {
status = -EIO;
goto cleanup;
}
status = 0;

/* Check PEC if last message is a read */
if (i && (msg[num-1].flags & I2C_M_RD)) {
status = i2c_smbus_check_pec(partial_pec, &msg[num-1]);
if (status < 0)
return status;
goto cleanup;
}

if (read_write == I2C_SMBUS_READ)
Expand All @@ -499,12 +502,13 @@ static s32 i2c_smbus_xfer_emulated(struct i2c_adapter *adapter, u16 addr,
break;
}

cleanup:
if (msg[0].flags & I2C_M_DMA_SAFE)
kfree(msg[0].buf);
if (msg[1].flags & I2C_M_DMA_SAFE)
kfree(msg[1].buf);

return 0;
return status;
}

/**
Expand Down

0 comments on commit 9aa6136

Please sign in to comment.