Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit e5d9cfc6 authored by Andrzej Hajda's avatar Andrzej Hajda Committed by Mark Brown
Browse files

ASoC: rsnd: fix usrcnt decrementing bug

Field usrcnt is unsigned so it cannot be lesser than zero.
The patch fixes the check, moves it to the beginning of the function
and changes return value to -EIO in case of usercnt error.

The problem has been detected using proposed semantic patch
scripts/coccinelle/tests/unsigned_lesser_than_zero.cocci [1].

[1]: http://permalink.gmane.org/gmane.linux.kernel/2038576



Signed-off-by: default avatarAndrzej Hajda <a.hajda@samsung.com>
Acked-by: default avatarKuninori Morimoto <kuninori.morimoto.gx@renesas.com>
Signed-off-by: default avatarMark Brown <broonie@kernel.org>
parent b4c83b17
Loading
Loading
Loading
Loading
+14 −13
Original line number Original line Diff line number Diff line
@@ -403,29 +403,30 @@ static int rsnd_ssi_quit(struct rsnd_mod *mod,
	struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod);
	struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod);
	struct device *dev = rsnd_priv_to_dev(priv);
	struct device *dev = rsnd_priv_to_dev(priv);


	if (rsnd_ssi_is_parent(mod, io))
	if (!ssi->usrcnt) {
		goto rsnd_ssi_quit_end;
		dev_err(dev, "%s[%d] usrcnt error\n",
			rsnd_mod_name(mod), rsnd_mod_id(mod));
		return -EIO;
	}


	if (!rsnd_ssi_is_parent(mod, io)) {
		if (ssi->err > 0)
		if (ssi->err > 0)
			dev_warn(dev, "%s[%d] under/over flow err = %d\n",
			dev_warn(dev, "%s[%d] under/over flow err = %d\n",
			 rsnd_mod_name(mod), rsnd_mod_id(mod), ssi->err);
				 rsnd_mod_name(mod), rsnd_mod_id(mod),
				 ssi->err);


		ssi->cr_own	= 0;
		ssi->cr_own	= 0;
		ssi->err	= 0;
		ssi->err	= 0;


		rsnd_ssi_irq_disable(mod);
		rsnd_ssi_irq_disable(mod);
	}


rsnd_ssi_quit_end:
	rsnd_ssi_master_clk_stop(ssi, io);
	rsnd_ssi_master_clk_stop(ssi, io);


	rsnd_mod_power_off(mod);
	rsnd_mod_power_off(mod);


	ssi->usrcnt--;
	ssi->usrcnt--;


	if (ssi->usrcnt < 0)
		dev_err(dev, "%s[%d] usrcnt error\n",
			rsnd_mod_name(mod), rsnd_mod_id(mod));

	return 0;
	return 0;
}
}