mcstrans: ensure transitivity in compare functions

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@googlemail.com>
Acked-by: James Carter <jwcart2@gmail.com>
This commit is contained in:
Christian Göttsche 2024-01-31 13:56:12 +01:00 committed by James Carter
parent 162a0884cc
commit fc2822a474

View File

@ -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