[PATCH] fdt_ro: Fix fdt_get_property_namelen() length bug
Peter Tyser
ptyser at xes-inc.com
Tue Mar 29 13:47:57 EST 2011
On Tue, 2011-03-29 at 12:34 +1100, David Gibson wrote:
> On Mon, Mar 28, 2011 at 05:19:35PM -0500, Peter Tyser wrote:
> > fdt_get_property_namelen() should only compare 'namelen' characters when
> > matching a property name. The previous code compared 'namelen'
> > characters correctly, but also required the property name length to
> > exactly match 'namelen'.
> >
> > This length matching requirement would result in bugs such as
> > "ethernet0" not being found when using fdt_get_property_namelen() to
> > find properties starting with "ethernet".
>
> Nack. The current behaviour of the *_namelen() functions is the
> intended one. Their purpose is not for doing partial matches, but
> instead for doing exact matches, but using a non-null-terminated
> string as the argument.
OK, your explanation of their intended use makes sense. The comments
describing the _namelen() functions seem a bit misleading though, eg:
/**
* fdt_get_property_namelen - find a property based on substring
* @fdt: pointer to the device tree blob
* @nodeoffset: offset of the node whose property to find
* @name: name of the property to find
* @namelen: number of characters of name to consider
* @lenp: pointer to an integer variable (will be overwritten) or NULL
*
* Identical to fdt_get_property_namelen(), but only examine the first
* namelen characters of name for matching the property name.
*/
That make it sound like its specifically for partial matching of
substrings in general.
> For example get_subnode_offset_namelen() is
> used internally for comparing names against path components without
> having to copy and null terminate the pieces of the path first.
fdt_subnode_offset_namelen() shouldn't be affected by this patch as it
does its length checking in _fdt_nodename_eq() instead of
_fdt_string_eq(). I assume your argument still applies to paths that do
use _fdt_string_eq() though.
Is there a downside to allowing partial matching? I'm not too familiar
with libfdt, but it seems like it would make it more flexible to allow
arbitrary namelen matching. The places I see that do use _namelen()
functions to do non-null string matching seem like they'd still work
fine with this change applied, eg in fdt_path_offset().
Thanks for the comments and explanation,
Peter
More information about the devicetree-discuss
mailing list