Proposed prom parse fix + moving.

Grant Likely grant.likely at secretlab.ca
Tue Apr 21 07:15:23 EST 2009


On Fri, Apr 17, 2009 at 11:35 PM, Grant Likely
<grant.likely at secretlab.ca> wrote:
> On Fri, Apr 17, 2009 at 4:07 PM, Ilpo Järvinen
>> [PATCH] powerpc & microblaze: add missing of_node_put to error handling
>>
>> While reviewing some microblaze patches a while ago, I noticed
>> a suspicious error handling in of_irq_map_one(), which turned
>> out to be a copy from arch/powerpc. Grant Likely
>> <grant.likely at secretlab.ca> confirmed that this is a real bug.
>>
>> Merge error handling paths using goto with the normal return
>> path.
>>
>> Powerppc compile tested.
>>
>> Signed-off-by: Ilpo Järvinen <ilpo.jarvinen at helsinki.fi>
>
> Looks right to me (but I haven't tested).
>
> Acked-by: Grant Likely <grant.likely at secretlab.ca>

I've picked up the powerpc half of this patch, tested it, and pushed
it out to my -next tree and asked Ben or Paul to pull.

Michal, I leave it to you to pick up the Microblaze half.

Cheers,
g.


>
>> ---
>>  arch/microblaze/kernel/prom_parse.c |   11 +++++------
>>  arch/powerpc/kernel/prom_parse.c    |   11 +++++------
>>  2 files changed, 10 insertions(+), 12 deletions(-)
>>
>> diff --git a/arch/microblaze/kernel/prom_parse.c b/arch/microblaze/kernel/prom_parse.c
>> index ae0352e..d16c32f 100644
>> --- a/arch/microblaze/kernel/prom_parse.c
>> +++ b/arch/microblaze/kernel/prom_parse.c
>> @@ -903,7 +903,7 @@ int of_irq_map_one(struct device_node *device,
>>        struct device_node *p;
>>        const u32 *intspec, *tmp, *addr;
>>        u32 intsize, intlen;
>> -       int res;
>> +       int res = -EINVAL;
>>
>>        pr_debug("of_irq_map_one: dev=%s, index=%d\n",
>>                        device->full_name, index);
>> @@ -926,21 +926,20 @@ int of_irq_map_one(struct device_node *device,
>>
>>        /* Get size of interrupt specifier */
>>        tmp = of_get_property(p, "#interrupt-cells", NULL);
>> -       if (tmp == NULL) {
>> -               of_node_put(p);
>> -               return -EINVAL;
>> -       }
>> +       if (tmp == NULL)
>> +               goto out;
>>        intsize = *tmp;
>>
>>        pr_debug(" intsize=%d intlen=%d\n", intsize, intlen);
>>
>>        /* Check index */
>>        if ((index + 1) * intsize > intlen)
>> -               return -EINVAL;
>> +               goto out;
>>
>>        /* Get new specifier and map it */
>>        res = of_irq_map_raw(p, intspec + index * intsize, intsize,
>>                                addr, out_irq);
>> +out:
>>        of_node_put(p);
>>        return res;
>>  }
>> diff --git a/arch/powerpc/kernel/prom_parse.c b/arch/powerpc/kernel/prom_parse.c
>> index 8f0856f..8362620 100644
>> --- a/arch/powerpc/kernel/prom_parse.c
>> +++ b/arch/powerpc/kernel/prom_parse.c
>> @@ -971,7 +971,7 @@ int of_irq_map_one(struct device_node *device, int index, struct of_irq *out_irq
>>        struct device_node *p;
>>        const u32 *intspec, *tmp, *addr;
>>        u32 intsize, intlen;
>> -       int res;
>> +       int res = -EINVAL;
>>
>>        DBG("of_irq_map_one: dev=%s, index=%d\n", device->full_name, index);
>>
>> @@ -995,21 +995,20 @@ int of_irq_map_one(struct device_node *device, int index, struct of_irq *out_irq
>>
>>        /* Get size of interrupt specifier */
>>        tmp = of_get_property(p, "#interrupt-cells", NULL);
>> -       if (tmp == NULL) {
>> -               of_node_put(p);
>> -               return -EINVAL;
>> -       }
>> +       if (tmp == NULL)
>> +               goto out;
>>        intsize = *tmp;
>>
>>        DBG(" intsize=%d intlen=%d\n", intsize, intlen);
>>
>>        /* Check index */
>>        if ((index + 1) * intsize > intlen)
>> -               return -EINVAL;
>> +               goto out;
>>
>>        /* Get new specifier and map it */
>>        res = of_irq_map_raw(p, intspec + index * intsize, intsize,
>>                             addr, out_irq);
>> +out:
>>        of_node_put(p);
>>        return res;
>>  }
>> --
>> 1.5.6.5
>>
>
>
>
> --
> Grant Likely, B.Sc., P.Eng.
> Secret Lab Technologies Ltd.
>



-- 
Grant Likely, B.Sc., P.Eng.
Secret Lab Technologies Ltd.



More information about the Linuxppc-dev mailing list