From bd2ae2f41cb1ef7612e3b2cb7179bc6be6ec7f44 Mon Sep 17 00:00:00 2001 From: David Gibson Date: Wed, 29 Aug 2007 12:22:50 +1000 Subject: [PATCH] libfdt: Fix handling of trailing / in fdt_path_offset() Currently, fdt_path_offset() returns FDL_ERR_BADOFFSET if given a path with a trailing '/'. In particular this means that fdt_path_offset("/") returns FDT_ERR_BADOFFSET rather than 0 as one would expect. This patch fixes the function to accept and ignore trailing '/' characters. As well as allowing fdt_path_offset("/") this means that fdt_path_offset("/foo/") will return the same as fdt_path_offset("/foo") which seems in keeping with the principle of least surprise. This also adds a testcase to ensure that fdt_path_offset("/") returns 0 as it should. Signed-off-by: David Gibson --- libfdt/fdt_ro.c | 2 +- tests/path_offset.c | 8 ++++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/libfdt/fdt_ro.c b/libfdt/fdt_ro.c index 2ca1b22..e7a78de 100644 --- a/libfdt/fdt_ro.c +++ b/libfdt/fdt_ro.c @@ -154,7 +154,7 @@ int fdt_path_offset(const void *fdt, const char *path) while (*p == '/') p++; if (! *p) - return -FDT_ERR_BADPATH; + return offset; q = strchr(p, '/'); if (! q) q = end; diff --git a/tests/path_offset.c b/tests/path_offset.c index 05b0c32..c962000 100644 --- a/tests/path_offset.c +++ b/tests/path_offset.c @@ -58,6 +58,7 @@ int check_subnode(void *fdt, int parent, const char *name) int main(int argc, char *argv[]) { void *fdt; + int root_offset; int subnode1_offset, subnode2_offset; int subnode1_offset_p, subnode2_offset_p; int subsubnode1_offset, subsubnode2_offset; @@ -66,6 +67,13 @@ int main(int argc, char *argv[]) test_init(argc, argv); fdt = load_blob_arg(argc, argv); + root_offset = fdt_path_offset(fdt, "/"); + if (root_offset < 0) + FAIL("fdt_path_offset(\"/\") failed: %s", + fdt_strerror(root_offset)); + else if (root_offset != 0) + FAIL("fdt_path_offset(\"/\") returns incorrect offset %d", + root_offset); subnode1_offset = check_subnode(fdt, 0, "subnode1"); subnode2_offset = check_subnode(fdt, 0, "subnode2");