Commit e56fbc9d authored by Arnaldo Carvalho de Melo's avatar Arnaldo Carvalho de Melo
Browse files

perf tools: Use list_del_init() more thorougly

To allow for destructors to check if they're operating on a object still
in a list, and to avoid going from use after free list entries into
still valid, or even also other already removed from list entries.

Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: Namhyung Kim <namhyung@kernel.org>
Link: https://lkml.kernel.org/n/tip-deh17ub44atyox3j90e6rksu@git.kernel.org


Signed-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
parent d8f9da24
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -431,7 +431,7 @@ static void delete_filter_func(struct list_head *head)
	struct filter_entry *pos, *tmp;

	list_for_each_entry_safe(pos, tmp, head, list) {
		list_del(&pos->list);
		list_del_init(&pos->list);
		free(pos);
	}
}
+4 −4
Original line number Diff line number Diff line
@@ -454,7 +454,7 @@ broken:
		/* broken lock sequence, discard it */
		ls->discard = 1;
		bad_hist[BROKEN_ACQUIRE]++;
		list_del(&seq->list);
		list_del_init(&seq->list);
		free(seq);
		goto end;
	default:
@@ -515,7 +515,7 @@ static int report_lock_acquired_event(struct perf_evsel *evsel,
		/* broken lock sequence, discard it */
		ls->discard = 1;
		bad_hist[BROKEN_ACQUIRED]++;
		list_del(&seq->list);
		list_del_init(&seq->list);
		free(seq);
		goto end;
	default:
@@ -570,7 +570,7 @@ static int report_lock_contended_event(struct perf_evsel *evsel,
		/* broken lock sequence, discard it */
		ls->discard = 1;
		bad_hist[BROKEN_CONTENDED]++;
		list_del(&seq->list);
		list_del_init(&seq->list);
		free(seq);
		goto end;
	default:
@@ -639,7 +639,7 @@ static int report_lock_release_event(struct perf_evsel *evsel,

	ls->nr_release++;
free_seq:
	list_del(&seq->list);
	list_del_init(&seq->list);
	free(seq);
end:
	return 0;
+1 −1
Original line number Diff line number Diff line
@@ -407,7 +407,7 @@ static void free_arch_std_events(void)

	list_for_each_entry_safe(es, next, &arch_std_events, list) {
		FOR_ALL_EVENT_STRUCT_FIELDS(FREE_EVENT_FIELD);
		list_del(&es->list);
		list_del_init(&es->list);
		free(es);
	}
}
+1 −1
Original line number Diff line number Diff line
@@ -238,7 +238,7 @@ static void free_event_nodes(struct list_head *events)

	while (!list_empty(events)) {
		node = list_entry(events->next, struct event_node, list);
		list_del(&node->list);
		list_del_init(&node->list);
		free(node);
	}
}
+1 −1
Original line number Diff line number Diff line
@@ -152,7 +152,7 @@ static int perf_gtk__annotate_symbol(GtkWidget *window, struct symbol *sym,
	gtk_container_add(GTK_CONTAINER(window), view);

	list_for_each_entry_safe(pos, n, &notes->src->source, al.node) {
		list_del(&pos->al.node);
		list_del_init(&pos->al.node);
		disasm_line__free(pos);
	}

Loading