[Skiboot] [PATCH 1/3] core/device: Add function to return child node using name at substring "@"

Reza Arbab arbab at linux.ibm.com
Sat Sep 16 00:30:54 AEST 2023


Hi Athira,

On Thu, Sep 14, 2023 at 10:02:04PM +0530, Athira Rajeev wrote: 
>+struct dt_node *dt_find_by_name_before_addr(struct dt_node *root, const char *name)
>+{
>+	struct dt_node *child, *match;
>+	char *child_node = NULL;
>+
>+	list_for_each(&root->children, child, list) {
>+		child_node = strdup(child->name);
>+		if (!child_node)
>+			goto err;
>+		child_node = strtok(child_node, "@");
>+		if (!strcmp(child_node, name)) {
>+			free(child_node);
>+			return child;
>+		}
>+
>+		match = dt_find_by_name_before_addr(child, name);
>+		if (match)
>+			return match;

When the function returns on this line, child_node is not freed.

>+	}
>+
>+	free(child_node);
>+err:
>+	return NULL;
>+}

I took at stab at moving free(child_node) inside the loop, and ended up 
with this:

struct dt_node *dt_find_by_name_before_addr(struct dt_node *root, const char *name)
{
	struct dt_node *child, *match = NULL;
	char *child_name = NULL;

	list_for_each(&root->children, child, list) {
		child_name = strdup(child->name);
		if (!child_name)
			return NULL;

		child_name = strtok(child_name, "@");
		if (!strcmp(child_name, name))
			match = child;
		else
			match = dt_find_by_name_before_addr(child, name);

		free(child_name);
		if (match)
			return match;
	}

	return NULL;
}

Does this seem okay to you? If you agree, no need to send another 
revision, I can just fixup during commit. Let me know.

>diff --git a/core/test/run-device.c b/core/test/run-device.c
>index 4a12382bb..fb7a7d2c0 100644
>--- a/core/test/run-device.c
>+++ b/core/test/run-device.c
>@@ -466,6 +466,20 @@ int main(void)
> 	new_prop_ph = dt_prop_get_u32(ut2, "something");
> 	assert(!(new_prop_ph == ev1_ph));
> 	dt_free(subtree);
>+
>+	/* Test dt_find_by_name_before_addr */
>+	root = dt_new_root("");
>+	addr1 = dt_new_addr(root, "node", 0x1);
>+	addr2 = dt_new_addr(root, "node0_1", 0x2);
>+	assert(dt_find_by_name(root, "node at 1") == addr1);
>+	assert(dt_find_by_name(root, "node0_1 at 2") == addr2);
>+	assert(dt_find_by_name_before_addr(root, "node") == addr1);
>+	assert(dt_find_by_name_before_addr(root, "node0_") == NULL);

This line appears twice. As above, can fix during commit, so no need for 
a new patch.

>+	assert(dt_find_by_name_before_addr(root, "node0_1") == addr2);
>+	assert(dt_find_by_name_before_addr(root, "node0") == NULL);
>+	assert(dt_find_by_name_before_addr(root, "node0_") == NULL);
>+	dt_free(root);
>+
> 	return 0;
> }
>

-- 
Reza Arbab


More information about the Skiboot mailing list