[PATCH 09/61] bootwrapper: Add dt_is_compatible().

Scott Wood scottwood at freescale.com
Thu Jul 19 04:24:13 EST 2007


Milton Miller wrote:
>> +       for (pos = 0; pos + compat_len < len; pos++) {
>> +               if (!strcmp(buf + pos, compat))
>> +                       return 1;
>> +
>> +               while (buf[pos] && pos + compat_len < len)
>> +                       pos++;
> 
> 
> This is buggy: if you are searching for "ns16550" and the compatable is 
> "fsl,1234\0commons16550" this code will incorrectly says its compatable.

How so?

The first iteration will compare "ns16550" to "fsl,1234", find that they 
don't match, and advance to the '\0'.

The second iteration will compare "ns16550" to "commons16550", find that 
they don't match, and advance to the 'n'.

The third iteration will not happen, since the loop condition fails, and 
not-compatible is returned.

> Comparing pos < len instead will do the right thing, at the cost of a 
> few iterations of the loop.

I'll grant that the extra iterations aren't worth doing the strlen() -- 
I'm not sure why I did it that way.

-Scott



More information about the Linuxppc-dev mailing list