From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S933060AbbLXHEK (ORCPT ); Thu, 24 Dec 2015 02:04:10 -0500 Received: from mailout4.w1.samsung.com ([210.118.77.14]:27312 "EHLO mailout4.w1.samsung.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S932991AbbLXHEI (ORCPT ); Thu, 24 Dec 2015 02:04:08 -0500 X-AuditID: cbfec7f4-f79026d00000418a-27-567b98e5cf93 From: Andrzej Hajda To: Liam Girdwood , Mark Brown , Kuninori Morimoto Cc: Andrzej Hajda , Bartlomiej Zolnierkiewicz , Marek Szyprowski , Jaroslav Kysela , Takashi Iwai , alsa-devel@alsa-project.org (moderated list:SOUND - SOC LAYER / DYNAMIC AUDIO POWER MANAGEM...), linux-kernel@vger.kernel.org (open list) Subject: [PATCH v2] ASoC: rsnd: fix usrcnt decrementing bug Date: Thu, 24 Dec 2015 08:02:39 +0100 Message-id: <1450940559-16516-1-git-send-email-a.hajda@samsung.com> X-Mailer: git-send-email 1.9.1 In-reply-to: <87k2o4fkad.wl%kuninori.morimoto.gx@renesas.com> References: <87k2o4fkad.wl%kuninori.morimoto.gx@renesas.com> X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFlrPLMWRmVeSWpSXmKPExsVy+t/xy7pPZ1SHGay5a2lxa905VosrFw8x WWycsZ7VYurDJ2wWrw7vYrT4dqWDyeLyrjlsFmuP3GW36NzVz2qx4ftaRgcujw2fm9g8ds66 y+6xaVUnm8e+t8vYPL6dmcji0bdlFaPH+i1XWTw+b5IL4IjisklJzcksSy3St0vgyrjTYlmw l69ixl/dBsan3F2MHBwSAiYSG17xdzFyApliEhfurWcDsYUEljJKLNvo0MXIBWQ3MUk86NvJ DpJgE9CU+Lv5JhtIQkSggVHiyNs+FhCHWeABk8TS9gesIFOFBawlNk7zB2lgEVCVOLrgIROI zSvgLNHw7T4LxDY5iZPHJrOC2JwCthKf7z+A2mwj0X11G9sERt4FjAyrGEVTS5MLipPScw31 ihNzi0vz0vWS83M3MUKC8csOxsXHrA4xCnAwKvHwFtypChNiTSwrrsw9xCjBwawkwrt0WnWY EG9KYmVValF+fFFpTmrxIUZpDhYlcd65u96HCAmkJ5akZqemFqQWwWSZODilGhj9+Mx1ZX64 vj+8LXOz1cHisy4XfPSft7geOLJhqw/jR49jfVwH9oSHfw+at/7vc7W0lheRgSuf73afH94v WDkr+vSpeVs8+z38YpdsLj3hstbn6s4dfIabOjYqhV5ufKmQlfosRma90UW3u+t4k1ucH6+Z nBd17Rt/sd3mXSt/seavjJe/aNOuxFKckWioxVxUnAgAD6Rc6EICAAA= Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org 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 --- v2: changed according to Kuninori Morimoto advice --- sound/soc/sh/rcar/ssi.c | 27 ++++++++++++++------------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/sound/soc/sh/rcar/ssi.c b/sound/soc/sh/rcar/ssi.c index 0b91692..f23c921 100644 --- a/sound/soc/sh/rcar/ssi.c +++ b/sound/soc/sh/rcar/ssi.c @@ -364,29 +364,30 @@ static int rsnd_ssi_quit(struct rsnd_mod *mod, struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod); struct device *dev = rsnd_priv_to_dev(priv); - if (rsnd_ssi_is_parent(mod, io)) - goto rsnd_ssi_quit_end; + if (!ssi->usrcnt) { + dev_err(dev, "%s[%d] usrcnt error\n", + rsnd_mod_name(mod), rsnd_mod_id(mod)); + return -EIO; + } - if (ssi->err > 0) - dev_warn(dev, "%s[%d] under/over flow err = %d\n", - rsnd_mod_name(mod), rsnd_mod_id(mod), ssi->err); + if (!rsnd_ssi_is_parent(mod, io)) { + if (ssi->err > 0) + dev_warn(dev, "%s[%d] under/over flow err = %d\n", + rsnd_mod_name(mod), rsnd_mod_id(mod), + ssi->err); - ssi->cr_own = 0; - ssi->err = 0; + ssi->cr_own = 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_mod_power_off(mod); ssi->usrcnt--; - if (ssi->usrcnt < 0) - dev_err(dev, "%s[%d] usrcnt error\n", - rsnd_mod_name(mod), rsnd_mod_id(mod)); - return 0; } -- 1.9.1