| From 20174ecab92c1b17c5204a6499b3551533bdd6ad Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Wed, 13 Oct 2021 21:52:17 -0700 |
| Subject: tracing/cfi: Fix cmp_entries_* functions signature mismatch |
| |
| From: Kalesh Singh <kaleshsingh@google.com> |
| |
| [ Upstream commit 7ce1bb83a14019f8c396d57ec704d19478747716 ] |
| |
| If CONFIG_CFI_CLANG=y, attempting to read an event histogram will cause |
| the kernel to panic due to failed CFI check. |
| |
| 1. echo 'hist:keys=common_pid' >> events/sched/sched_switch/trigger |
| 2. cat events/sched/sched_switch/hist |
| 3. kernel panics on attempting to read hist |
| |
| This happens because the sort() function expects a generic |
| int (*)(const void *, const void *) pointer for the compare function. |
| To prevent this CFI failure, change tracing map cmp_entries_* function |
| signatures to match this. |
| |
| Also, fix the build error reported by the kernel test robot [1]. |
| |
| [1] https://lore.kernel.org/r/202110141140.zzi4dRh4-lkp@intel.com/ |
| |
| Link: https://lkml.kernel.org/r/20211014045217.3265162-1-kaleshsingh@google.com |
| |
| Signed-off-by: Kalesh Singh <kaleshsingh@google.com> |
| Reported-by: kernel test robot <lkp@intel.com> |
| Signed-off-by: Steven Rostedt (VMware) <rostedt@goodmis.org> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| kernel/trace/tracing_map.c | 40 ++++++++++++++++++++++---------------- |
| 1 file changed, 23 insertions(+), 17 deletions(-) |
| |
| diff --git a/kernel/trace/tracing_map.c b/kernel/trace/tracing_map.c |
| index 9e31bfc818ff8..10657b8dc2c2d 100644 |
| --- a/kernel/trace/tracing_map.c |
| +++ b/kernel/trace/tracing_map.c |
| @@ -834,29 +834,35 @@ int tracing_map_init(struct tracing_map *map) |
| return err; |
| } |
| |
| -static int cmp_entries_dup(const struct tracing_map_sort_entry **a, |
| - const struct tracing_map_sort_entry **b) |
| +static int cmp_entries_dup(const void *A, const void *B) |
| { |
| + const struct tracing_map_sort_entry *a, *b; |
| int ret = 0; |
| |
| - if (memcmp((*a)->key, (*b)->key, (*a)->elt->map->key_size)) |
| + a = *(const struct tracing_map_sort_entry **)A; |
| + b = *(const struct tracing_map_sort_entry **)B; |
| + |
| + if (memcmp(a->key, b->key, a->elt->map->key_size)) |
| ret = 1; |
| |
| return ret; |
| } |
| |
| -static int cmp_entries_sum(const struct tracing_map_sort_entry **a, |
| - const struct tracing_map_sort_entry **b) |
| +static int cmp_entries_sum(const void *A, const void *B) |
| { |
| const struct tracing_map_elt *elt_a, *elt_b; |
| + const struct tracing_map_sort_entry *a, *b; |
| struct tracing_map_sort_key *sort_key; |
| struct tracing_map_field *field; |
| tracing_map_cmp_fn_t cmp_fn; |
| void *val_a, *val_b; |
| int ret = 0; |
| |
| - elt_a = (*a)->elt; |
| - elt_b = (*b)->elt; |
| + a = *(const struct tracing_map_sort_entry **)A; |
| + b = *(const struct tracing_map_sort_entry **)B; |
| + |
| + elt_a = a->elt; |
| + elt_b = b->elt; |
| |
| sort_key = &elt_a->map->sort_key; |
| |
| @@ -873,18 +879,21 @@ static int cmp_entries_sum(const struct tracing_map_sort_entry **a, |
| return ret; |
| } |
| |
| -static int cmp_entries_key(const struct tracing_map_sort_entry **a, |
| - const struct tracing_map_sort_entry **b) |
| +static int cmp_entries_key(const void *A, const void *B) |
| { |
| const struct tracing_map_elt *elt_a, *elt_b; |
| + const struct tracing_map_sort_entry *a, *b; |
| struct tracing_map_sort_key *sort_key; |
| struct tracing_map_field *field; |
| tracing_map_cmp_fn_t cmp_fn; |
| void *val_a, *val_b; |
| int ret = 0; |
| |
| - elt_a = (*a)->elt; |
| - elt_b = (*b)->elt; |
| + a = *(const struct tracing_map_sort_entry **)A; |
| + b = *(const struct tracing_map_sort_entry **)B; |
| + |
| + elt_a = a->elt; |
| + elt_b = b->elt; |
| |
| sort_key = &elt_a->map->sort_key; |
| |
| @@ -989,10 +998,8 @@ static void sort_secondary(struct tracing_map *map, |
| struct tracing_map_sort_key *primary_key, |
| struct tracing_map_sort_key *secondary_key) |
| { |
| - int (*primary_fn)(const struct tracing_map_sort_entry **, |
| - const struct tracing_map_sort_entry **); |
| - int (*secondary_fn)(const struct tracing_map_sort_entry **, |
| - const struct tracing_map_sort_entry **); |
| + int (*primary_fn)(const void *, const void *); |
| + int (*secondary_fn)(const void *, const void *); |
| unsigned i, start = 0, n_sub = 1; |
| |
| if (is_key(map, primary_key->field_idx)) |
| @@ -1061,8 +1068,7 @@ int tracing_map_sort_entries(struct tracing_map *map, |
| unsigned int n_sort_keys, |
| struct tracing_map_sort_entry ***sort_entries) |
| { |
| - int (*cmp_entries_fn)(const struct tracing_map_sort_entry **, |
| - const struct tracing_map_sort_entry **); |
| + int (*cmp_entries_fn)(const void *, const void *); |
| struct tracing_map_sort_entry *sort_entry, **entries; |
| int i, n_entries, ret; |
| |
| -- |
| 2.33.0 |
| |