libctf: pass the thunk down properly when wrapping qsort_r
authorNick Alcock <nick.alcock@oracle.com>
Tue, 30 Jun 2020 17:02:28 +0000 (18:02 +0100)
committerNick Alcock <nick.alcock@oracle.com>
Wed, 22 Jul 2020 16:57:52 +0000 (17:57 +0100)
When wrapping qsort_r on a system like FreeBSD on which the compar
argument comes first, we wrap the passed arg in a thunk so we can pass
down both the caller-supplied comparator function and its argument.  We
should pass the *argument* down to the comparator, not the thunk, which
is basically random nonsense on the stack from the point of view of the
caller of qsort_r.

libctf/
ctf-decls.h (ctf_qsort_compar_thunk): Fix arg passing.

libctf/ChangeLog
libctf/ctf-decls.h

index 779f7b1cc873cc35e4a5b4cc26f38e574ba19312..4a10f63d00c12c11f45ce128791fea413e97c633 100644 (file)
@@ -1,3 +1,7 @@
+2020-07-22  Nick Alcock  <nick.alcock@oracle.com>
+
+       ctf-decls.h (ctf_qsort_compar_thunk): Fix arg passing.
+
 2020-07-22  Nick Alcock  <nick.alcock@oracle.com>
 
        * ctf-impl.h (ctf_next_hkv_t): New, kv-pairs passed to
index 51041c592f452f3be5f18199adb59c12bf5dd2fb..c47a72e722f362a89ff4bbfd8fac1021b89d290f 100644 (file)
@@ -46,7 +46,7 @@ ctf_qsort_compar_thunk (void *arg, const void *a, const void *b)
 {
   struct ctf_qsort_arg *qsort_arg = (struct ctf_qsort_arg *) arg;
 
-  return qsort_arg->compar (a, b, arg);
+  return qsort_arg->compar (a, b, qsort_arg->arg);
 }
 
 static inline void