lkml.org 
[lkml]   [2003]   [Sep]   [24]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
Patch in this message
/
Date
From
SubjectRe: [CHECKER] 32 Memory Leaks on Error Paths
> Date: Tue, 23 Sep 2003 13:15:15 -0700
> From: Chris Wright <chrisw@osdl.org>

> --- 1.38/sound/oss/ymfpci.c Tue Aug 26 09:25:41 2003
> +++ edited/sound/oss/ymfpci.c Tue Sep 23 12:42:45 2003
> @@ -2638,6 +2638,7 @@
> out_free:
> if (codec->ac97_codec[0])
> ac97_release_codec(codec->ac97_codec[0]);
> + kfree(codec);
> return -ENODEV;
> }

Someone was savaging sound code, adding these bugs.
For 2.6, the above patch is probably ok; it's immaterial,
because ALSA won long ago.

A patch for 2.4 to undo the damage is attached.

-- Pete

diff -ur -X dontdiff linux-2.4.23-pre5/drivers/sound/ymfpci.c linux-2.4.23-pre5-nip/drivers/sound/ymfpci.c
--- linux-2.4.23-pre5/drivers/sound/ymfpci.c 2003-09-23 17:41:04.000000000 -0700
+++ linux-2.4.23-pre5-nip/drivers/sound/ymfpci.c 2003-09-23 20:44:46.000000000 -0700
@@ -173,43 +173,40 @@

static void ymfpci_codec_write(struct ac97_codec *dev, u8 reg, u16 val)
{
- ymfpci_t *codec = dev->private_data;
+ ymfpci_t *unit = dev->private_data;
u32 cmd;

- spin_lock(&codec->ac97_lock);
+ down(&unit->ac97_lock);
/* XXX Do make use of dev->id */
- ymfpci_codec_ready(codec, 0, 0);
+ ymfpci_codec_ready(unit, 0, 0);
cmd = ((YDSXG_AC97WRITECMD | reg) << 16) | val;
- ymfpci_writel(codec, YDSXGR_AC97CMDDATA, cmd);
- spin_unlock(&codec->ac97_lock);
+ ymfpci_writel(unit, YDSXGR_AC97CMDDATA, cmd);
+ up(&unit->ac97_lock);
}

-static u16 _ymfpci_codec_read(ymfpci_t *unit, u8 reg)
+static u16 ymfpci_codec_read(struct ac97_codec *dev, u8 reg)
{
+ ymfpci_t *unit = dev->private_data;
int i;
+ u16 ret;

+ down(&unit->ac97_lock);
if (ymfpci_codec_ready(unit, 0, 0))
- return ~0;
+ goto out_none;
ymfpci_writew(unit, YDSXGR_AC97CMDADR, YDSXG_AC97READCMD | reg);
if (ymfpci_codec_ready(unit, 0, 0))
- return ~0;
+ goto out_none;
if (unit->pci->device == PCI_DEVICE_ID_YAMAHA_744 && unit->rev < 2) {
for (i = 0; i < 600; i++)
ymfpci_readw(unit, YDSXGR_PRISTATUSDATA);
}
- return ymfpci_readw(unit, YDSXGR_PRISTATUSDATA);
-}
-
-static u16 ymfpci_codec_read(struct ac97_codec *dev, u8 reg)
-{
- ymfpci_t *unit = dev->private_data;
- u16 ret;
-
- spin_lock(&unit->ac97_lock);
- ret = _ymfpci_codec_read(unit, reg);
- spin_unlock(&unit->ac97_lock);
-
+ ret = ymfpci_readw(unit, YDSXGR_PRISTATUSDATA);
+ up(&unit->ac97_lock);
return ret;
+
+out_none:
+ up(&unit->ac97_lock);
+ return ~0;
}

/*
@@ -2526,7 +2523,7 @@

spin_lock_init(&codec->reg_lock);
spin_lock_init(&codec->voice_lock);
- spin_lock_init(&codec->ac97_lock);
+ init_MUTEX(&codec->ac97_lock);
init_MUTEX(&codec->open_sem);
INIT_LIST_HEAD(&codec->states);
codec->pci = pcidev;
@@ -2625,6 +2622,7 @@
out_release_region:
release_mem_region(pci_resource_start(pcidev, 0), 0x8000);
out_free:
+ kfree(codec);
return -ENODEV;
}

@@ -2652,6 +2650,7 @@
unload_uart401(&codec->mpu_data);
}
#endif /* CONFIG_SOUND_YMFPCI_LEGACY */
+ kfree(codec);
}

MODULE_AUTHOR("Jaroslav Kysela");
diff -ur -X dontdiff linux-2.4.23-pre5/drivers/sound/ymfpci.h linux-2.4.23-pre5-nip/drivers/sound/ymfpci.h
--- linux-2.4.23-pre5/drivers/sound/ymfpci.h 2003-09-23 17:56:01.000000000 -0700
+++ linux-2.4.23-pre5-nip/drivers/sound/ymfpci.h 2003-09-23 20:46:06.000000000 -0700
@@ -275,7 +275,7 @@

spinlock_t reg_lock;
spinlock_t voice_lock;
- spinlock_t ac97_lock;
+ struct semaphore ac97_lock;

/* soundcore stuff */
int dev_audio;
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
\
 
 \ /
  Last update: 2005-03-22 13:48    [W:0.068 / U:2.716 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site