Skip to content

Commit 69fb6ea

Browse files
committed
perf annotate: Use zfree() to avoid possibly accessing dangling pointers
When freeing a->b it is good practice to set a->b to NULL using zfree(&a->b) so that when we have a bug where a reference to a freed 'a' pointer is kept somewhere, we can more quickly cause a segfault if some code tries to use a->b. This is mostly done but some new cases were introduced recently, convert them to zfree(). Cc: Adrian Hunter <[email protected]> Cc: Ian Rogers <[email protected]> Cc: Jiri Olsa <[email protected]> Cc: Kan Liang <[email protected]> Cc: Namhyung Kim <[email protected]> Link: https://lore.kernel.org/lkml/ZjmbHHrjIm5YRIBv@x1 Signed-off-by: Arnaldo Carvalho de Melo <[email protected]>
1 parent 37862d6 commit 69fb6ea

File tree

3 files changed

+13
-11
lines changed

3 files changed

+13
-11
lines changed

tools/perf/ui/browsers/annotate-data.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
// SPDX-License-Identifier: GPL-2.0
22
#include <inttypes.h>
33
#include <string.h>
4+
#include <linux/zalloc.h>
45
#include <sys/ttydefaults.h>
56

67
#include "ui/browser.h"
@@ -130,7 +131,7 @@ static void annotated_data_browser__delete_entries(struct annotated_data_browser
130131

131132
list_for_each_entry_safe(pos, tmp, &browser->entries, node) {
132133
list_del_init(&pos->node);
133-
free(pos->hists);
134+
zfree(&pos->hists);
134135
free(pos);
135136
}
136137
}

tools/perf/util/annotate-data.c

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
#include <stdio.h>
99
#include <stdlib.h>
1010
#include <inttypes.h>
11+
#include <linux/zalloc.h>
1112

1213
#include "annotate.h"
1314
#include "annotate-data.h"
@@ -311,8 +312,8 @@ static void delete_members(struct annotated_member *member)
311312
list_for_each_entry_safe(child, tmp, &member->children, node) {
312313
list_del(&child->node);
313314
delete_members(child);
314-
free(child->type_name);
315-
free(child->var_name);
315+
zfree(&child->type_name);
316+
zfree(&child->var_name);
316317
free(child);
317318
}
318319
}
@@ -582,7 +583,7 @@ void global_var_type__tree_delete(struct rb_root *root)
582583

583584
rb_erase(node, root);
584585
gvar = rb_entry(node, struct global_var_entry, node);
585-
free(gvar->name);
586+
zfree(&gvar->name);
586587
free(gvar);
587588
}
588589
}
@@ -1817,16 +1818,16 @@ static int alloc_data_type_histograms(struct annotated_data_type *adt, int nr_en
18171818

18181819
err:
18191820
while (--i >= 0)
1820-
free(adt->histograms[i]);
1821-
free(adt->histograms);
1821+
zfree(&(adt->histograms[i]));
1822+
zfree(&adt->histograms);
18221823
return -ENOMEM;
18231824
}
18241825

18251826
static void delete_data_type_histograms(struct annotated_data_type *adt)
18261827
{
18271828
for (int i = 0; i < adt->nr_histograms; i++)
1828-
free(adt->histograms[i]);
1829-
free(adt->histograms);
1829+
zfree(&(adt->histograms[i]));
1830+
zfree(&adt->histograms);
18301831
}
18311832

18321833
void annotated_data_type__tree_delete(struct rb_root *root)
@@ -1840,7 +1841,7 @@ void annotated_data_type__tree_delete(struct rb_root *root)
18401841
pos = rb_entry(node, struct annotated_data_type, node);
18411842
delete_members(&pos->self);
18421843
delete_data_type_histograms(pos);
1843-
free(pos->self.type_name);
1844+
zfree(&pos->self.type_name);
18441845
free(pos);
18451846
}
18461847
}

tools/perf/util/annotate.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2618,13 +2618,13 @@ static void delete_basic_blocks(struct basic_block_data *bb_data)
26182618

26192619
list_for_each_entry_safe(link, tmp, &bb_data->queue, node) {
26202620
list_del(&link->node);
2621-
free(link->bb);
2621+
zfree(&link->bb);
26222622
free(link);
26232623
}
26242624

26252625
list_for_each_entry_safe(link, tmp, &bb_data->visited, node) {
26262626
list_del(&link->node);
2627-
free(link->bb);
2627+
zfree(&link->bb);
26282628
free(link);
26292629
}
26302630
}

0 commit comments

Comments
 (0)