drivers: mmc: fix issue raised by source code analyzer tool

Fix the below reported issues by source code analyzer.

1) Pointer 'ext_csd' returned from call to function 'mmc_get_ext_csd'
may be NULL and will be dereferenced at ext_csd[EXT_CSD_CMDQ] in
mmc_test_awake_ext_csd(), causing NUll pointer derefernce.

2) Array 'sdhci_slot' of size 2 may use index value(s) -1 as below,
when ret = 0.

	sdhci_slot[ret-1] = msm_host;

3) Variable 'host->lock' locked ,And was not unlocked when below
condition occurs in sdhci_irq().

	if (!mmc_card_and_host_support_async_int(host->mmc))
		return IRQ_NONE;

CRs-Fixed: 1000387
Change-Id: Iec6ecef1bf940e720c871be58b265394904f0cf1
Signed-off-by: Pavan Anamula <pavana@codeaurora.org>
This commit is contained in:
Pavan Anamula 2016-03-30 22:07:56 +05:30 committed by Kyle Yan
parent 9ed18dec09
commit 3c7b269a36
3 changed files with 5 additions and 3 deletions

View file

@ -2439,7 +2439,7 @@ static int mmc_test_awake_ext_csd(struct mmc_host *host)
struct mmc_card *card = host->card;
err = mmc_get_ext_csd(card, &ext_csd);
if (err) {
if (err || !ext_csd) {
pr_err("%s: %s: mmc_get_ext_csd failed (%d)\n",
mmc_hostname(host), __func__, err);
return err;

View file

@ -3936,7 +3936,7 @@ static int sdhci_msm_probe(struct platform_device *pdev)
/* Extract platform data */
if (pdev->dev.of_node) {
ret = of_alias_get_id(pdev->dev.of_node, "sdhc");
if (ret < 0) {
if (ret <= 0) {
dev_err(&pdev->dev, "Failed to get slot index %d\n",
ret);
goto pltfm_free;

View file

@ -3089,8 +3089,10 @@ static irqreturn_t sdhci_irq(int irq, void *dev_id)
if (!host->clock && host->mmc->card &&
mmc_card_sdio(host->mmc->card)) {
if (!mmc_card_and_host_support_async_int(host->mmc))
if (!mmc_card_and_host_support_async_int(host->mmc)) {
spin_unlock(&host->lock);
return IRQ_NONE;
}
/*
* async card interrupt is level sensitive and received
* when clocks are off.