aboutsummaryrefslogtreecommitdiffstats
path: root/sound
diff options
context:
space:
mode:
authorAndrzej Hajda <a.hajda@samsung.com>2015-12-24 02:02:39 -0500
committerMark Brown <broonie@kernel.org>2015-12-30 12:13:20 -0500
commite5d9cfc6f5fe56caa44cefbc7ef4531c480d901d (patch)
tree31e8236e2d2920a7059eb440c3094d3380add4f5 /sound
parentb4c83b171557815a0b31a36805900cc9f21c9ee4 (diff)
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: Andrzej Hajda <a.hajda@samsung.com> Acked-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com> Signed-off-by: Mark Brown <broonie@kernel.org>
Diffstat (limited to 'sound')
-rw-r--r--sound/soc/sh/rcar/ssi.c27
1 files changed, 14 insertions, 13 deletions
diff --git a/sound/soc/sh/rcar/ssi.c b/sound/soc/sh/rcar/ssi.c
index 7db05fdfb656..7ee89da4dd5f 100644
--- a/sound/soc/sh/rcar/ssi.c
+++ b/sound/soc/sh/rcar/ssi.c
@@ -403,29 +403,30 @@ static int rsnd_ssi_quit(struct rsnd_mod *mod,
403 struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod); 403 struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod);
404 struct device *dev = rsnd_priv_to_dev(priv); 404 struct device *dev = rsnd_priv_to_dev(priv);
405 405
406 if (rsnd_ssi_is_parent(mod, io)) 406 if (!ssi->usrcnt) {
407 goto rsnd_ssi_quit_end; 407 dev_err(dev, "%s[%d] usrcnt error\n",
408 rsnd_mod_name(mod), rsnd_mod_id(mod));
409 return -EIO;
410 }
408 411
409 if (ssi->err > 0) 412 if (!rsnd_ssi_is_parent(mod, io)) {
410 dev_warn(dev, "%s[%d] under/over flow err = %d\n", 413 if (ssi->err > 0)
411 rsnd_mod_name(mod), rsnd_mod_id(mod), ssi->err); 414 dev_warn(dev, "%s[%d] under/over flow err = %d\n",
415 rsnd_mod_name(mod), rsnd_mod_id(mod),
416 ssi->err);
412 417
413 ssi->cr_own = 0; 418 ssi->cr_own = 0;
414 ssi->err = 0; 419 ssi->err = 0;
415 420
416 rsnd_ssi_irq_disable(mod); 421 rsnd_ssi_irq_disable(mod);
422 }
417 423
418rsnd_ssi_quit_end:
419 rsnd_ssi_master_clk_stop(ssi, io); 424 rsnd_ssi_master_clk_stop(ssi, io);
420 425
421 rsnd_mod_power_off(mod); 426 rsnd_mod_power_off(mod);
422 427
423 ssi->usrcnt--; 428 ssi->usrcnt--;
424 429
425 if (ssi->usrcnt < 0)
426 dev_err(dev, "%s[%d] usrcnt error\n",
427 rsnd_mod_name(mod), rsnd_mod_id(mod));
428
429 return 0; 430 return 0;
430} 431}
431 432