From 691c9fe8e01081814500c56add4abd19b5deb7e5 Mon Sep 17 00:00:00 2001 From: Bananymous Date: Wed, 2 Apr 2025 00:03:50 +0300 Subject: [PATCH] LibC: Fix bsearch bsearch had unsigned integer underflow which was UB and returned false positives --- userspace/libraries/LibC/stdlib.cpp | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/userspace/libraries/LibC/stdlib.cpp b/userspace/libraries/LibC/stdlib.cpp index 03afe1c2..34cbfead 100644 --- a/userspace/libraries/LibC/stdlib.cpp +++ b/userspace/libraries/LibC/stdlib.cpp @@ -713,24 +713,26 @@ void* bsearch(const void* key, const void* base, size_t nel, size_t width, int ( if (nel == 0) return nullptr; - const uint8_t* base_u8 = reinterpret_cast(base); + const uint8_t* base_u8 = static_cast(base); size_t l = 0; size_t r = nel - 1; - while (l <= r) + while (l < r) { - const size_t mid = (l + r) / 2; + const size_t mid = l + (r - l) / 2; int res = compar(key, base_u8 + mid * width); if (res == 0) return const_cast(base_u8 + mid * width); - if (res < 0) - r = mid - 1; - else + if (res > 0) l = mid + 1; + else + r = mid ? mid - 1 : 0; } + if (l < nel && compar(key, base_u8 + l * width) == 0) + return const_cast(base_u8 + l * width); return nullptr; }