2004-03-02 21:42:47

by Benjamin Herrenschmidt

[permalink] [raw]
Subject: [PATCH] ppc32: Fix crash on load in DACA sound driver

Hi !

The DACA sound driver (early iBook models) doesn't clear the i2c_client
structure. That cause the embedded struct device (and thus kobject) to
contain garbage in the "k_name" field, which kobject_set_name will
later try to kfree...
Also removes references to unused struct data_data.

===== sound/oss/dmasound/dac3550a.c 1.2 vs edited =====
--- 1.2/sound/oss/dmasound/dac3550a.c Tue Sep 30 10:25:28 2003
+++ edited/sound/oss/dmasound/dac3550a.c Tue Mar 2 21:32:04 2004
@@ -42,11 +42,6 @@
/* Unique ID allocation */
static int daca_id;

-struct daca_data
-{
- int arf; /* place holder for furture use */
-};
-
struct i2c_driver daca_driver = {
.owner = THIS_MODULE,
.name = "DAC3550A driver V " DACA_VERSION,
@@ -168,12 +163,12 @@
{
const char *client_name = "DAC 3550A Digital Equalizer";
struct i2c_client *new_client;
- struct daca_data *data;
int rc = -ENODEV;

- new_client = kmalloc(sizeof(*new_client) + sizeof(*data), GFP_KERNEL);
+ new_client = kmalloc(sizeof(*new_client), GFP_KERNEL);
if (!new_client)
return -ENOMEM;
+ memset(new_client, 0, sizeof(*new_client));

new_client->addr = address;
new_client->adapter = adapter;
@@ -181,9 +176,6 @@
new_client->flags = 0;
strcpy(new_client->name, client_name);
new_client->id = daca_id++; /* racy... */
-
- data = (struct daca_data *)(new_client+1);
- dev_set_drvdata(&new_client->dev, data);

if (daca_init_client(new_client))
goto bail;



2004-03-02 22:22:10

by Wojciech 'Sas' Cieciwa

[permalink] [raw]
Subject: [PATCH] ppc32: macserial.c missing variable declaration


in file drivers/macintosh/macserial.c are two undeclared variable named
"cmd"

based on 2.6.4-rc1+cset-20040302_0821.
fixed by this patch.

--- linux-2.6.4-rc1/drivers/macintosh/macserial.c.org 2004-02-27 23:21:29.000000000 +0100
+++ linux-2.6.4-rc1/drivers/macintosh/macserial.c 2004-03-02 21:49:44.533392464 +0100
@@ -1781,6 +1781,7 @@
{
struct mac_serial * info = (struct mac_serial *)tty->driver_data;
unsigned char control, status;
+ unsigned int cmd;
unsigned long flags;

#ifdef CONFIG_KGDB
@@ -1811,6 +1812,7 @@
{
struct mac_serial * info = (struct mac_serial *)tty->driver_data;
unsigned int arg, bits;
+ unsigned int cmd;
unsigned long flags;

#ifdef CONFIG_KGDB


--
{Wojciech 'Sas' Cieciwa} {Member of PLD Team }
{e-mail: [email protected], http://www2.zarz.agh.edu.pl/~cieciwa}

2004-03-02 22:29:48

by Linus Torvalds

[permalink] [raw]
Subject: Re: [PATCH] ppc32: macserial.c missing variable declaration



On Wed, 3 Mar 2004, Wojciech 'Sas' Cieciwa wrote:
> {
> struct mac_serial * info = (struct mac_serial *)tty->driver_data;
> unsigned char control, status;
> + unsigned int cmd;
> unsigned long flags;
>
> #ifdef CONFIG_KGDB

This can't be right. Those variables are never initialized anywhere.

The usage of 'cmd' should either be removed entirely, or it should be
passed in as an argument, it looks like. In the meantime, it's better to
have code that doesn't compile than code that compiles but can't possibly
do anything sane.

Linus

2004-03-02 23:04:30

by Benjamin Herrenschmidt

[permalink] [raw]
Subject: Re: [PATCH] ppc32: macserial.c missing variable declaration


> This can't be right. Those variables are never initialized anywhere.
>
> The usage of 'cmd' should either be removed entirely, or it should be
> passed in as an argument, it looks like. In the meantime, it's better to
> have code that doesn't compile than code that compiles but can't possibly
> do anything sane.

macserial is obsolete on 2.6. it should be removed. pmac_zilog is the
replacement.

I still haven't found the bug with pmac_zilog that caused the occasional
crash on boot on the G5 though (it seems to be a subtle race, I haven't
found anything wrong with pmac_zilog itself), but then, I've been
quite busy with other things latey.

Ben.