tracing: Fix cmp_entries_dup() to respect sort() comparison rules
BugLink: https://bugs.launchpad.net/bugs/2102118
commit e63fbd5f6810ed756bbb8a1549c7d4132968baa9 upstream.
The cmp_entries_dup() function used as the comparator for sort()
violated the symmetry and transitivity properties required by the
sorting algorithm. Specifically, it returned 1 whenever memcmp() was
non-zero, which broke the following expectations:
* Symmetry: If x < y, then y > x.
* Transitivity: If x < y and y < z, then x < z.
These violations could lead to incorrect sorting and failure to
correctly identify duplicate elements.
Fix the issue by directly returning the result of memcmp(), which
adheres to the required comparison properties.
Cc: stable@vger.kernel.org
Fixes: 08d43a5fa0 ("tracing: Add lock-free tracing_map")
Link: https://lore.kernel.org/20241203202228.1274403-1-visitorckw@gmail.com
Signed-off-by: Kuan-Wei Chiu <visitorckw@gmail.com>
Signed-off-by: Steven Rostedt (Google) <rostedt@goodmis.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Signed-off-by: Koichiro Den <koichiro.den@canonical.com>
Signed-off-by: Stefan Bader <stefan.bader@canonical.com>
This commit is contained in:
committed by
Stefan Bader
parent
4542e891f2
commit
f79e36fa59
@@ -845,15 +845,11 @@ int tracing_map_init(struct tracing_map *map)
|
||||
static int cmp_entries_dup(const void *A, const void *B)
|
||||
{
|
||||
const struct tracing_map_sort_entry *a, *b;
|
||||
int ret = 0;
|
||||
|
||||
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;
|
||||
return memcmp(a->key, b->key, a->elt->map->key_size);
|
||||
}
|
||||
|
||||
static int cmp_entries_sum(const void *A, const void *B)
|
||||
|
||||
Reference in New Issue
Block a user