bug-bash
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[PATCH] globsort: handle int overflow in cmp functions


From: Grisha Levit
Subject: [PATCH] globsort: handle int overflow in cmp functions
Date: Fri, 17 May 2024 12:57:25 -0400

The current cmp implementation for size and blocks subtracts the two
values and returns the difference as an int. This subtraction can
overflow, and the returned int can end up having the wrong sign.

This also makes the qsort comparison function non-transitive. (Some
interesting discussion on that at [1]).

[1]: https://www.qualys.com/2024/01/30/qsort.txt
---
 pathexp.c | 8 ++++++--
 1 file changed, 6 insertions(+), 2 deletions(-)

diff --git a/pathexp.c b/pathexp.c
index f62efafb..9335f8d5 100644
--- a/pathexp.c
+++ b/pathexp.c
@@ -747,7 +747,9 @@ globsort_namecmp (char **s1, char **s2)
 static int
 globsort_sizecmp (struct globsort_t *g1, struct globsort_t *g2)
 {
-  return ((glob_sorttype < SORT_REVERSE) ? g1->st.size - g2->st.size : 
g2->st.size - g1->st.size);
+  return (glob_sorttype < SORT_REVERSE)
+        ? (g1->st.size > g2->st.size) - (g1->st.size < g2->st.size)
+        : (g2->st.size > g1->st.size) - (g1->st.size < g2->st.size);
 }
 
 static int
@@ -779,7 +781,9 @@ globsort_timecmp (struct globsort_t *g1, struct globsort_t 
*g2)
 static int
 globsort_blockscmp (struct globsort_t *g1, struct globsort_t *g2)
 {
-  return ((glob_sorttype < SORT_REVERSE) ? g1->st.blocks - g2->st.blocks : 
g2->st.blocks - g1->st.blocks);
+  return (glob_sorttype < SORT_REVERSE)
+        ? (g1->st.blocks > g2->st.blocks) - (g1->st.size < g2->st.blocks)
+        : (g2->st.blocks > g1->st.blocks) - (g1->st.size < g2->st.blocks);
 }
 
 static struct globsort_t *
-- 
2.45.1




reply via email to

[Prev in Thread] Current Thread [Next in Thread]