summaryrefslogtreecommitdiff
path: root/libctf
diff options
context:
space:
mode:
authorNick Alcock <nick.alcock@oracle.com>2023-01-23 13:11:32 +0000
committerNick Alcock <nick.alcock@oracle.com>2023-03-24 13:37:32 +0000
commitca96e367f057c068fb9f016dd7beba55d5d29d81 (patch)
tree9f42457af58a5da614fbbe14a132c51f6f37f43e /libctf
parent4460691252d5c345f0b34ac366639df23c687832 (diff)
downloadbinutils-gdb-ca96e367f057c068fb9f016dd7beba55d5d29d81.tar.gz
libctf: fix assertion failure with no system qsort_r
If no suitable qsort_r is found in libc, we fall back to an implementation in ctf-qsort.c. But this implementation routinely calls the comparison function with two identical arguments. The comparison function that ensures that the order of output types is stable is not ready for this, misinterprets it as a type appearing more that once (a can-never-happen condition) and fails with an assertion failure. Fixed, audited for further instances of the same failure (none found) and added a no-qsort test to my regular testsuite run. libctf/: PR libctf/30013 * ctf-dedup.c (sort_output_mapping): Inputs are always equal to themselves.
Diffstat (limited to 'libctf')
-rw-r--r--libctf/ctf-dedup.c4
1 files changed, 4 insertions, 0 deletions
diff --git a/libctf/ctf-dedup.c b/libctf/ctf-dedup.c
index c46f69e7449..6297c45c84d 100644
--- a/libctf/ctf-dedup.c
+++ b/libctf/ctf-dedup.c
@@ -2306,6 +2306,10 @@ sort_output_mapping (const ctf_next_hkv_t *one, const ctf_next_hkv_t *two,
ctf_id_t one_type;
ctf_id_t two_type;
+ /* Inputs are always equal to themselves. */
+ if (one == two)
+ return 0;
+
one_gid = ctf_dynhash_lookup (d->cd_output_first_gid, one_hval);
two_gid = ctf_dynhash_lookup (d->cd_output_first_gid, two_hval);