Ensure comparison functions used by qsort(3) fulfill transitivity, since otherwise the resulting array might not be sorted correctly or worse[1] in case of integer overflows. [1]: https://www.qualys.com/2024/01/30/qsort.txt Signed-off-by: Christian Göttsche <cgzones@xxxxxxxxxxxxxx> --- mcstrans/src/mcstrans.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/mcstrans/src/mcstrans.c b/mcstrans/src/mcstrans.c index af3f507e..fded3235 100644 --- a/mcstrans/src/mcstrans.c +++ b/mcstrans/src/mcstrans.c @@ -952,9 +952,13 @@ find_in_hashtable(const char *range, domain_t *domain, context_map_node_t **tabl return trans; } +#define spaceship_cmp(a, b) (((a) > (b)) - ((a) < (b))) + static int string_size(const void *p1, const void *p2) { - return strlen(*(char **)p2) - strlen(*(char **)p1); + size_t len1 = strlen(*(const char *const *)p2); + size_t len2 = strlen(*(const char *const *)p1); + return spaceship_cmp(len1, len2); } static int @@ -965,7 +969,7 @@ word_size(const void *p1, const void *p2) { int w2_len=strlen(w2->text); if (w1_len == w2_len) return strcmp(w1->text, w2->text); - return (w2_len - w1_len); + return spaceship_cmp(w2_len, w1_len); } static void -- 2.43.0