Hi,
Fix possible null pointer kfree.

Signed-off-by: dave young <[EMAIL PROTECTED]>

mixer_oss.c |    120 +-
1 file changed, 74 insertions(+), 46 deletions(-)

diff -purN linux/sound/core/oss/mixer_oss.c linux.new/sound/core/oss/mixer_oss.c
--- linux/sound/core/oss/mixer_oss.c    2007-06-01 09:00:12.000000000 +0000
+++ linux.new/sound/core/oss/mixer_oss.c        2007-06-01 09:36:10.000000000 
+0000
@@ -512,23 +512,27 @@ static void snd_mixer_oss_get_volume1_vo
                return;
        }
        uinfo = kzalloc(sizeof(*uinfo), GFP_KERNEL);
+       if (uinfo == NULL)
+               goto out_uinfo;
        uctl = kzalloc(sizeof(*uctl), GFP_KERNEL);
-       if (uinfo == NULL || uctl == NULL)
-               goto __unalloc;
+       if (uctl == NULL)
+               goto out_uctl;
        if (kctl->info(kctl, uinfo))
-               goto __unalloc;
+               goto out;
        if (kctl->get(kctl, uctl))
-               goto __unalloc;
+               goto out;
        if (uinfo->type == SNDRV_CTL_ELEM_TYPE_BOOLEAN &&
            uinfo->value.integer.min == 0 && uinfo->value.integer.max == 1)
-               goto __unalloc;
+               goto out;
        *left = snd_mixer_oss_conv1(uctl->value.integer.value[0],
uinfo->value.integer.min, uinfo->value.integer.max,
&pslot->volume[0]);
        if (uinfo->count > 1)
                *right = snd_mixer_oss_conv1(uctl->value.integer.value[1],
uinfo->value.integer.min, uinfo->value.integer.max,
&pslot->volume[1]);
-      __unalloc:
+out:
+       kfree(uctl);
+out_uctl:
+       kfree(uinfo);
+out_uinfo:
        up_read(&card->controls_rwsem);
-       kfree(uctl);
-       kfree(uinfo);
}

static void snd_mixer_oss_get_volume1_sw(struct snd_mixer_oss_file *fmixer,
@@ -550,13 +554,15 @@ static void snd_mixer_oss_get_volume1_sw
                return;
        }
        uinfo = kzalloc(sizeof(*uinfo), GFP_KERNEL);
+       if (uinfo == NULL)
+               goto out_uinfo;
        uctl = kzalloc(sizeof(*uctl), GFP_KERNEL);
-       if (uinfo == NULL || uctl == NULL)
-               goto __unalloc;
+       if (uctl == NULL)
+               goto out_uctl;
        if (kctl->info(kctl, uinfo))
-               goto __unalloc;
+               goto out;
        if (kctl->get(kctl, uctl))
-               goto __unalloc;
+               goto out;
        if (!uctl->value.integer.value[0]) {
                *left = 0;
                if (uinfo->count == 1)
@@ -564,10 +570,12 @@ static void snd_mixer_oss_get_volume1_sw
        }
        if (uinfo->count > 1 && !uctl->value.integer.value[route ? 3 : 1])
                *right = 0;
-      __unalloc:
-       up_read(&card->controls_rwsem);
-       kfree(uctl);
+out:
+       kfree(uctl);
+out_uctl:
        kfree(uinfo);
+out_uinfo:
+       up_read(&card->controls_rwsem);
}

static int snd_mixer_oss_get_volume1(struct snd_mixer_oss_file *fmixer,
@@ -613,25 +621,29 @@ static void snd_mixer_oss_put_volume1_vo
        if ((kctl = snd_ctl_find_numid(card, numid)) == NULL)
                return;
        uinfo = kzalloc(sizeof(*uinfo), GFP_KERNEL);
+       if (uinfo == NULL)
+               goto out_uinfo;
        uctl = kzalloc(sizeof(*uctl), GFP_KERNEL);
-       if (uinfo == NULL || uctl == NULL)
-               goto __unalloc;
+       if (uctl == NULL)
+               goto out_uctl;
        if (kctl->info(kctl, uinfo))
-               goto __unalloc;
+               goto out;
        if (uinfo->type == SNDRV_CTL_ELEM_TYPE_BOOLEAN &&
            uinfo->value.integer.min == 0 && uinfo->value.integer.max == 1)
-               goto __unalloc;
+               goto out;
        uctl->value.integer.value[0] = snd_mixer_oss_conv2(left,
uinfo->value.integer.min, uinfo->value.integer.max);
        if (uinfo->count > 1)
                uctl->value.integer.value[1] = snd_mixer_oss_conv2(right,
uinfo->value.integer.min, uinfo->value.integer.max);
        if ((res = kctl->put(kctl, uctl)) < 0)
-               goto __unalloc;
+               goto out;
        if (res > 0)
                snd_ctl_notify(card, SNDRV_CTL_EVENT_MASK_VALUE, &kctl->id);
-      __unalloc:
-       up_read(&card->controls_rwsem);
-       kfree(uctl);
+out:
+       kfree(uctl);
+out_uctl:
        kfree(uinfo);
+out_uinfo:
+       up_read(&card->controls_rwsem);
}

static void snd_mixer_oss_put_volume1_sw(struct snd_mixer_oss_file *fmixer,
@@ -654,11 +666,13 @@ static void snd_mixer_oss_put_volume1_sw
                return;
        }
        uinfo = kzalloc(sizeof(*uinfo), GFP_KERNEL);
+       if (uinfo == NULL)
+               goto out_uinfo;
        uctl = kzalloc(sizeof(*uctl), GFP_KERNEL);
-       if (uinfo == NULL || uctl == NULL)
-               goto __unalloc;
+       if (uctl == NULL)
+               goto out_uctl;
        if (kctl->info(kctl, uinfo))
-               goto __unalloc;
+               goto out;
        if (uinfo->count > 1) {
                uctl->value.integer.value[0] = left > 0 ? 1 : 0;
                uctl->value.integer.value[route ? 3 : 1] = right > 0 ? 1 : 0;
@@ -670,13 +684,15 @@ static void snd_mixer_oss_put_volume1_sw
                uctl->value.integer.value[0] = (left > 0 || right > 0) ? 1 : 0;
        }
        if ((res = kctl->put(kctl, uctl)) < 0)
-               goto __unalloc;
+               goto out;
        if (res > 0)
                snd_ctl_notify(card, SNDRV_CTL_EVENT_MASK_VALUE, &kctl->id);
-      __unalloc:
-       up_read(&card->controls_rwsem);
-       kfree(uctl);
+out:
+       kfree(uctl);
+out_uctl:
        kfree(uinfo);
+out_uinfo:
+       up_read(&card->controls_rwsem);
}

static int snd_mixer_oss_put_volume1(struct snd_mixer_oss_file *fmixer,
@@ -775,21 +791,25 @@ static int snd_mixer_oss_get_recsrc2(str
        int err, idx;
        
        uinfo = kzalloc(sizeof(*uinfo), GFP_KERNEL);
+       if (uinfo == NULL){
+               err = -ENOMEM;
+               goto out_uinfo;
+       }
        uctl = kzalloc(sizeof(*uctl), GFP_KERNEL);
-       if (uinfo == NULL || uctl == NULL) {
+       if (uctl == NULL) {
                err = -ENOMEM;
-               goto __unlock;
+               goto out_uctl;
        }
        down_read(&card->controls_rwsem);
        kctl = snd_mixer_oss_test_id(mixer, "Capture Source", 0);
        if (! kctl) {
                err = -ENOENT;
-               goto __unlock;
+               goto out;
        }
        if ((err = kctl->info(kctl, uinfo)) < 0)
-               goto __unlock;
+               goto out;
        if ((err = kctl->get(kctl, uctl)) < 0)
-               goto __unlock;
+               goto out;
        for (idx = 0; idx < 32; idx++) {
                if (!(mixer->mask_recsrc & (1 << idx)))
                        continue;
@@ -805,10 +825,12 @@ static int snd_mixer_oss_get_recsrc2(str
                }
        }
        err = 0;
-      __unlock:
+out:
+       kfree(uctl);
+out_uctl:
+       kfree(uinfo);
+out_uinfo:
        up_read(&card->controls_rwsem);
-       kfree(uctl);
-       kfree(uinfo);
        return err;
}

@@ -825,19 +847,23 @@ static int snd_mixer_oss_put_recsrc2(str
        unsigned int idx;

        uinfo = kzalloc(sizeof(*uinfo), GFP_KERNEL);
+       if (uinfo == NULL){
+               err = -ENOMEM;
+               goto out_uinfo;
+       }
        uctl = kzalloc(sizeof(*uctl), GFP_KERNEL);
-       if (uinfo == NULL || uctl == NULL) {
+       if (uctl == NULL) {
                err = -ENOMEM;
-               goto __unlock;
+               goto out_uctl;
        }
        down_read(&card->controls_rwsem);
        kctl = snd_mixer_oss_test_id(mixer, "Capture Source", 0);
        if (! kctl) {
                err = -ENOENT;
-               goto __unlock;
+               goto out;
        }
        if ((err = kctl->info(kctl, uinfo)) < 0)
-               goto __unlock;
+               goto out;
        for (idx = 0; idx < 32; idx++) {
                if (!(mixer->mask_recsrc & (1 << idx)))
                        continue;
@@ -852,18 +878,20 @@ static int snd_mixer_oss_put_recsrc2(str
                slot = NULL;
        }
        if (! slot)
-               goto __unlock;
+               goto out;
        for (idx = 0; idx < uinfo->count; idx++)
                uctl->value.enumerated.item[idx] = slot->capture_item;
        err = kctl->put(kctl, uctl);
        if (err > 0)
                snd_ctl_notify(fmixer->card, SNDRV_CTL_EVENT_MASK_VALUE, 
&kctl->id);
        err = 0;
-      __unlock:
-       up_read(&card->controls_rwsem);
+out:
        kfree(uctl);
+out_uctl:
        kfree(uinfo);
-       return err;
+out_uinfo:
+       up_read(&card->controls_rwsem);
+       return err;
}

struct snd_mixer_oss_assign_table {


Regards
dave
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to