From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1760758AbbBIN6O (ORCPT ); Mon, 9 Feb 2015 08:58:14 -0500 Received: from cantor2.suse.de ([195.135.220.15]:35191 "EHLO mx2.suse.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1760210AbbBIN6M (ORCPT ); Mon, 9 Feb 2015 08:58:12 -0500 Date: Mon, 09 Feb 2015 14:58:09 +0100 Message-ID: From: Takashi Iwai To: Dan Carpenter Cc: Jaroslav Kysela , Lars-Peter Clausen , Hans Wennborg , Benoit Taine , Bjorn Helgaas , alsa-devel@alsa-project.org, linux-kernel@vger.kernel.org, kernel-janitors@vger.kernel.org Subject: Re: [patch v2] ALSA: off by one bug in snd_riptide_joystick_probe() In-Reply-To: <20150209135139.GA26866@mwanda> References: <20150209135139.GA26866@mwanda> User-Agent: Wanderlust/2.15.9 (Almost Unreal) SEMI/1.14.6 (Maruoka) FLIM/1.14.9 (=?UTF-8?B?R29qxY0=?=) APEL/10.8 Emacs/24.4 (x86_64-suse-linux-gnu) MULE/6.0 (HANACHIRUSATO) MIME-Version: 1.0 (generated by SEMI 1.14.6 - "Maruoka") Content-Type: text/plain; charset=US-ASCII Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org At Mon, 9 Feb 2015 16:51:40 +0300, Dan Carpenter wrote: > > The problem here is that we check: > > if (dev >= SNDRV_CARDS) > > Then we increment "dev". > > if (!joystick_port[dev++]) > > Then we use it as an offset into a array with SNDRV_CARDS elements. > > if (!request_region(joystick_port[dev], 8, "Riptide gameport")) { > > This has 3 effects: > 1) If you use the module option to specify the joystick port then it has > to be shifted one space over. > 2) The wrong error message will be printed on failure if you have over > 32 cards. > 3) Static checkers will correctly complain that are off by one. > > Fixes: db1005ec6ff8 ('ALSA: riptide - Fix joystick resource handling') > Signed-off-by: Dan Carpenter > --- > v2: In the original patch I just made the array larger. Applied, thanks. Takashi > > diff --git a/sound/pci/riptide/riptide.c b/sound/pci/riptide/riptide.c > index 29f2827..94639d6 100644 > --- a/sound/pci/riptide/riptide.c > +++ b/sound/pci/riptide/riptide.c > @@ -2011,32 +2011,43 @@ snd_riptide_joystick_probe(struct pci_dev *pci, const struct pci_device_id *id) > { > static int dev; > struct gameport *gameport; > + int ret; > > if (dev >= SNDRV_CARDS) > return -ENODEV; > + > if (!enable[dev]) { > - dev++; > - return -ENOENT; > + ret = -ENOENT; > + goto inc_dev; > } > > - if (!joystick_port[dev++]) > - return 0; > + if (!joystick_port[dev]) { > + ret = 0; > + goto inc_dev; > + } > > gameport = gameport_allocate_port(); > - if (!gameport) > - return -ENOMEM; > + if (!gameport) { > + ret = -ENOMEM; > + goto inc_dev; > + } > if (!request_region(joystick_port[dev], 8, "Riptide gameport")) { > snd_printk(KERN_WARNING > "Riptide: cannot grab gameport 0x%x\n", > joystick_port[dev]); > gameport_free_port(gameport); > - return -EBUSY; > + ret = -EBUSY; > + goto inc_dev; > } > > gameport->io = joystick_port[dev]; > gameport_register_port(gameport); > pci_set_drvdata(pci, gameport); > - return 0; > + > + ret = 0; > +inc_dev: > + dev++; > + return ret; > } > > static void snd_riptide_joystick_remove(struct pci_dev *pci) >