Skip to content

Commit

Permalink
mcstrans: ensure transitivity in compare functions
Browse files Browse the repository at this point in the history
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 <[email protected]>
Acked-by: James Carter <[email protected]>
  • Loading branch information
cgzones authored and jwcart2 committed Mar 4, 2024
1 parent 162a088 commit fc2822a
Showing 1 changed file with 6 additions and 2 deletions.
8 changes: 6 additions & 2 deletions mcstrans/src/mcstrans.c
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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
Expand Down

0 comments on commit fc2822a

Please sign in to comment.