From: Érico Rolim <erico....@gmail.com>

This program is single threaded, so using qsort with a global variable
isn't a danger. The interface for qsort_r isn't standardized (and
diverges between glibc and FreeBSD, for example), which makes usage of
qsort, where possible, preferrable.
---

FreeBSD's qsort_r can be seen in:

http://man.bsd.lv/FreeBSD-12.0/qsort

 src/ChangeLog |  4 ++++
 src/readelf.c | 14 ++++++++++----
 2 files changed, 14 insertions(+), 4 deletions(-)

diff --git a/src/ChangeLog b/src/ChangeLog
index a7b227db..9bb90732 100644
--- a/src/ChangeLog
+++ b/src/ChangeLog
@@ -1,3 +1,7 @@
+2020-12-16  Érico Nogueira  <eric...@disroot.org>
+
+       * readelf.c (qsort_r): Use qsort for improved portability.
+
 2020-12-16  Dmitry V. Levin  <l...@altlinux.org>
 
        * *.c: Replace gettext(...) with _(...).
diff --git a/src/readelf.c b/src/readelf.c
index 824ab31b..f2ebd206 100644
--- a/src/readelf.c
+++ b/src/readelf.c
@@ -4829,10 +4829,13 @@ listptr_base (struct listptr *p)
   return cudie_base (&cu);
 }
 
+/* To store the name used in compare_listptr */
+static const char *sort_listptr_name;
+
 static int
-compare_listptr (const void *a, const void *b, void *arg)
+compare_listptr (const void *a, const void *b)
 {
-  const char *name = arg;
+  const char *name = sort_listptr_name;
   struct listptr *p1 = (void *) a;
   struct listptr *p2 = (void *) b;
 
@@ -4942,8 +4945,11 @@ static void
 sort_listptr (struct listptr_table *table, const char *name)
 {
   if (table->n > 0)
-    qsort_r (table->table, table->n, sizeof table->table[0],
-            &compare_listptr, (void *) name);
+    {
+      sort_listptr_name = name;
+      qsort (table->table, table->n, sizeof table->table[0],
+            &compare_listptr);
+    }
 }
 
 static bool
-- 
2.29.2

Reply via email to