Thread (7 messages) 7 messages, 2 authors, 2023-09-25

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

From: Athira Rajeev <hidden>
Date: 2023-09-15 18:02:24

On 15-Sep-2023, at 8:00 PM, Reza Arbab [off-list ref] wrote:

Hi Athira,

On Thu, Sep 14, 2023 at 10:02:04PM +0530, Athira Rajeev wrote: 
quoted
+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.
quoted
+ }
+
+ 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.
Hi Reza,

Sure, Change looks good. Thanks for the change and fixup.

Thanks
Athira
quoted
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@1") == addr1);
+ assert(dt_find_by_name(root, "node0_1@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.
quoted
+ 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
  
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help