Browse Source

Make name_node() xstrdup its name argument

The name field of 'struct node' was really always supposed to be a
malloc()ed string, that is owned by the structure.  To avoid an extra
strdup() for strings coming up from the lexer, name_node() expects to take
uch an already malloc()ed string, which means it's not correct to pass it
a static string literal.

That's a pretty non-obvious constraint, so a bunch of incorrect uses have
crept in.  Really, avoiding the extra dup from the lexer isn't a big enough
benefit for this demonstrably dangerous interface.  So change it to do the
xstrdup() itself, removing the burden from callers.

Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
main
David Gibson 2 years ago
parent
commit
fd68bb8c56
  1. 2
      dtc-parser.y
  2. 8
      dtc.h
  3. 17
      livetree.c

2
dtc-parser.y

@ -573,10 +573,12 @@ subnode:
DT_PROPNODENAME nodedef DT_PROPNODENAME nodedef
{ {
$$ = name_node($2, $1); $$ = name_node($2, $1);
free($1);
} }
| DT_DEL_NODE DT_PROPNODENAME ';' | DT_DEL_NODE DT_PROPNODENAME ';'
{ {
$$ = name_node(build_node_delete(&@$), $2); $$ = name_node(build_node_delete(&@$), $2);
free($2);
} }
| DT_OMIT_NO_REF subnode | DT_OMIT_NO_REF subnode
{ {

8
dtc.h

@ -269,7 +269,7 @@ struct property *reverse_properties(struct property *first);
struct node *build_node(struct property *proplist, struct node *children, struct node *build_node(struct property *proplist, struct node *children,
struct srcpos *srcpos); struct srcpos *srcpos);
struct node *build_node_delete(struct srcpos *srcpos); struct node *build_node_delete(struct srcpos *srcpos);
struct node *name_node(struct node *node, char *name); struct node *name_node(struct node *node, const char *name);
struct node *omit_node_if_unused(struct node *node); struct node *omit_node_if_unused(struct node *node);
struct node *reference_node(struct node *node); struct node *reference_node(struct node *node);
struct node *chain_node(struct node *first, struct node *list); struct node *chain_node(struct node *first, struct node *list);
@ -336,9 +336,9 @@ struct dt_info *build_dt_info(unsigned int dtsflags,
struct reserve_info *reservelist, struct reserve_info *reservelist,
struct node *tree, uint32_t boot_cpuid_phys); struct node *tree, uint32_t boot_cpuid_phys);
void sort_tree(struct dt_info *dti); void sort_tree(struct dt_info *dti);
void generate_label_tree(struct dt_info *dti, char *name, bool allocph); void generate_label_tree(struct dt_info *dti, const char *name, bool allocph);
void generate_fixups_tree(struct dt_info *dti, char *name); void generate_fixups_tree(struct dt_info *dti, const char *name);
void generate_local_fixups_tree(struct dt_info *dti, char *name); void generate_local_fixups_tree(struct dt_info *dti, const char *name);


/* Checks */ /* Checks */



17
livetree.c

@ -116,11 +116,11 @@ struct node *build_node_delete(struct srcpos *srcpos)
return new; return new;
} }


struct node *name_node(struct node *node, char *name) struct node *name_node(struct node *node, const char *name)
{ {
assert(node->name == NULL); assert(node->name == NULL);


node->name = name; node->name = xstrdup(name);


return node; return node;
} }
@ -250,6 +250,7 @@ struct node * add_orphan_node(struct node *dt, struct node *new_node, char *ref)
name_node(new_node, "__overlay__"); name_node(new_node, "__overlay__");
node = build_node(p, new_node, NULL); node = build_node(p, new_node, NULL);
name_node(node, name); name_node(node, name);
free(name);


add_child(dt, node); add_child(dt, node);
return dt; return dt;
@ -808,18 +809,18 @@ void sort_tree(struct dt_info *dti)
} }


/* utility helper to avoid code duplication */ /* utility helper to avoid code duplication */
static struct node *build_and_name_child_node(struct node *parent, char *name) static struct node *build_and_name_child_node(struct node *parent, const char *name)
{ {
struct node *node; struct node *node;


node = build_node(NULL, NULL, NULL); node = build_node(NULL, NULL, NULL);
name_node(node, xstrdup(name)); name_node(node, name);
add_child(parent, node); add_child(parent, node);


return node; return node;
} }


static struct node *build_root_node(struct node *dt, char *name) static struct node *build_root_node(struct node *dt, const char *name)
{ {
struct node *an; struct node *an;


@ -1040,7 +1041,7 @@ static void generate_local_fixups_tree_internal(struct dt_info *dti,
generate_local_fixups_tree_internal(dti, lfn, c); generate_local_fixups_tree_internal(dti, lfn, c);
} }


void generate_label_tree(struct dt_info *dti, char *name, bool allocph) void generate_label_tree(struct dt_info *dti, const char *name, bool allocph)
{ {
if (!any_label_tree(dti, dti->dt)) if (!any_label_tree(dti, dti->dt))
return; return;
@ -1048,7 +1049,7 @@ void generate_label_tree(struct dt_info *dti, char *name, bool allocph)
dti->dt, allocph); dti->dt, allocph);
} }


void generate_fixups_tree(struct dt_info *dti, char *name) void generate_fixups_tree(struct dt_info *dti, const char *name)
{ {
if (!any_fixup_tree(dti, dti->dt)) if (!any_fixup_tree(dti, dti->dt))
return; return;
@ -1056,7 +1057,7 @@ void generate_fixups_tree(struct dt_info *dti, char *name)
dti->dt); dti->dt);
} }


void generate_local_fixups_tree(struct dt_info *dti, char *name) void generate_local_fixups_tree(struct dt_info *dti, const char *name)
{ {
if (!any_local_fixup_tree(dti, dti->dt)) if (!any_local_fixup_tree(dti, dti->dt))
return; return;

Loading…
Cancel
Save