[libc-commits] [libc] 9417d9f - [libc] Make the bump pointer explicitly return null on buffer oveerrun

Joseph Huber via libc-commits libc-commits at lists.llvm.org
Mon May 15 04:16:02 PDT 2023


Author: Joseph Huber
Date: 2023-05-15T06:15:52-05:00
New Revision: 9417d9fc38c81e1c13aec49f81fa7bf93c9a4bb6

URL: https://github.com/llvm/llvm-project/commit/9417d9fc38c81e1c13aec49f81fa7bf93c9a4bb6
DIFF: https://github.com/llvm/llvm-project/commit/9417d9fc38c81e1c13aec49f81fa7bf93c9a4bb6.diff

LOG: [libc] Make the bump pointer explicitly return null on buffer oveerrun

We use a simple bump ptr in the `libc` tests. If we run out of data we
can currently return other static memory and have weird failure cases.
We should fail more explicitly here by returning a null pointer instead.

Reviewed By: sivachandra

Differential Revision: https://reviews.llvm.org/D150529

Added: 
    

Modified: 
    libc/test/IntegrationTest/test.cpp
    libc/test/UnitTest/HermeticTestUtils.cpp

Removed: 
    


################################################################################
diff  --git a/libc/test/IntegrationTest/test.cpp b/libc/test/IntegrationTest/test.cpp
index e86e0a8d22c82..8e2feccd0dac7 100644
--- a/libc/test/IntegrationTest/test.cpp
+++ b/libc/test/IntegrationTest/test.cpp
@@ -57,7 +57,8 @@ int atexit(void (*func)(void)) { return __llvm_libc::atexit(func); }
 // which just hands out continuous blocks from a statically allocated chunk of
 // memory.
 
-static uint8_t memory[16384];
+static constexpr uint64_t MEMORY_SIZE = 16384;
+static uint8_t memory[MEMORY_SIZE];
 static uint8_t *ptr = memory;
 
 extern "C" {
@@ -65,7 +66,7 @@ extern "C" {
 void *malloc(size_t s) {
   void *mem = ptr;
   ptr += s;
-  return mem;
+  return static_cast<uint64_t>(ptr - memory) >= MEMORY_SIZE ? nullptr : mem;
 }
 
 void free(void *) {}

diff  --git a/libc/test/UnitTest/HermeticTestUtils.cpp b/libc/test/UnitTest/HermeticTestUtils.cpp
index c8279e54e15dd..04ec22f165b86 100644
--- a/libc/test/UnitTest/HermeticTestUtils.cpp
+++ b/libc/test/UnitTest/HermeticTestUtils.cpp
@@ -29,7 +29,8 @@ namespace {
 // requires. Hence, as a work around for this problem, we use a simple allocator
 // which just hands out continuous blocks from a statically allocated chunk of
 // memory.
-static uint8_t memory[16384];
+static constexpr uint64_t MEMORY_SIZE = 16384;
+static uint8_t memory[MEMORY_SIZE];
 static uint8_t *ptr = memory;
 
 } // anonymous namespace
@@ -68,7 +69,7 @@ void *malloc(size_t s) {
   s = ((s + ALIGNMENT - 1) / ALIGNMENT) * ALIGNMENT;
   void *mem = ptr;
   ptr += s;
-  return mem;
+  return static_cast<uint64_t>(ptr - memory) >= MEMORY_SIZE ? nullptr : mem;
 }
 
 void free(void *) {}


        


More information about the libc-commits mailing list