From d792c9d2797a5160e23827abdc71bfe500009cd3 Mon Sep 17 00:00:00 2001 From: Jakob Kaivo Date: Wed, 31 Jan 2024 16:40:42 -0500 Subject: add UB checks for search/sort --- src/stdlib/bsearch.c | 5 +++++ src/stdlib/qsort.c | 2 ++ 2 files changed, 7 insertions(+) diff --git a/src/stdlib/bsearch.c b/src/stdlib/bsearch.c index ae60783e..c710406e 100644 --- a/src/stdlib/bsearch.c +++ b/src/stdlib/bsearch.c @@ -12,9 +12,14 @@ void * bsearch(const void * key, const void * base, size_t nmemb, size_t size, i const char *addr = base; SIGNAL_SAFE(0); + ASSERT_NONNULL(key); + ASSERT_NONNULL(base); /* overlap can't be detected because the size of key can't be known */ + /* TODO: ensure everything is in order to start with */ + while (ret == NULL) { + /* TODO: ensure compar doesn't modify things */ int comp = compar(key, addr + (i * size)); if (comp == 0) { return (void*)(addr + (i * size)); diff --git a/src/stdlib/qsort.c b/src/stdlib/qsort.c index 42764817..346dba88 100644 --- a/src/stdlib/qsort.c +++ b/src/stdlib/qsort.c @@ -24,6 +24,7 @@ static void __qsort(char *base, size_t size, size_t lo, size_t hi, int (*compar) } for (j = lo; j < hi; j++) { + /* TODO: ensure compar() doesn't modify things */ if (compar(base + (size * j), base + (size * hi)) < 0) { __swap(base, size, i, j); i++; @@ -38,6 +39,7 @@ static void __qsort(char *base, size_t size, size_t lo, size_t hi, int (*compar) void qsort(void * base, size_t nmemb, size_t size, int (*compar)(const void *, const void *)) { SIGNAL_SAFE(0); + ASSERT_NONNULL(base); __qsort(base, size, 0, nmemb - 1, compar); } -- cgit v1.2.1