aboutsummaryrefslogtreecommitdiffstats
path: root/arch/powerpc
diff options
context:
space:
mode:
authorDavid Gibson <david@gibson.dropbear.id.au>2008-10-30 12:37:05 -0400
committerPaul Mackerras <paulus@samba.org>2008-10-31 05:14:19 -0400
commit2dccbf4ea05d2c3603b8c1359019bf7148a316a5 (patch)
treec487b77ce6218a39d84b72539eb6f99021080952 /arch/powerpc
parent210434d7633d477aa503454d68511fa2904e418e (diff)
powerpc: Fix bug in kernel copy of libfdt's fdt_subnode_offset_namelen()
There's currently an off-by-one bug in fdt_subnode_offset_namelen() which causes it to keep searching after it's finished the subnodes of the given parent, and into the subnodes of siblings of the original node which come after it in the tree. This bug was introduced in commit ed95d7450dcbfeb45ffc9d39b1747aee82b49a51 ("powerpc: Update in-kernel dtc and libfdt to version 1.2.0"). A patch has already been submitted to dtc/libfdt mainline. We don't really want to pull in a new upstream version during the 2.6.28 cycle, but we should still fix this bug, hence this standalone version of the fix for the in-kernel libfdt. Signed-off-by: David Gibson <david@gibson.dropbear.id.au> Signed-off-by: Paul Mackerras <paulus@samba.org>
Diffstat (limited to 'arch/powerpc')
-rw-r--r--arch/powerpc/boot/libfdt/fdt_ro.c9
1 files changed, 6 insertions, 3 deletions
diff --git a/arch/powerpc/boot/libfdt/fdt_ro.c b/arch/powerpc/boot/libfdt/fdt_ro.c
index 129b532bcc1a..fbbba44fcd0d 100644
--- a/arch/powerpc/boot/libfdt/fdt_ro.c
+++ b/arch/powerpc/boot/libfdt/fdt_ro.c
@@ -104,8 +104,8 @@ int fdt_subnode_offset_namelen(const void *fdt, int offset,
104 104
105 FDT_CHECK_HEADER(fdt); 105 FDT_CHECK_HEADER(fdt);
106 106
107 for (depth = 0; 107 for (depth = 0, offset = fdt_next_node(fdt, offset, &depth);
108 offset >= 0; 108 (offset >= 0) && (depth > 0);
109 offset = fdt_next_node(fdt, offset, &depth)) { 109 offset = fdt_next_node(fdt, offset, &depth)) {
110 if (depth < 0) 110 if (depth < 0)
111 return -FDT_ERR_NOTFOUND; 111 return -FDT_ERR_NOTFOUND;
@@ -114,7 +114,10 @@ int fdt_subnode_offset_namelen(const void *fdt, int offset,
114 return offset; 114 return offset;
115 } 115 }
116 116
117 return offset; /* error */ 117 if (offset < 0)
118 return offset; /* error */
119 else
120 return -FDT_ERR_NOTFOUND;
118} 121}
119 122
120int fdt_subnode_offset(const void *fdt, int parentoffset, 123int fdt_subnode_offset(const void *fdt, int parentoffset,