From 72cb7a70bfc2184c5ece0815740c3d594a06bf50 Mon Sep 17 00:00:00 2001 From: Andrew Noyes Date: Wed, 1 May 2024 13:06:52 -0700 Subject: [PATCH] Check for OOM --- VersionedMap.cpp | 56 +++++++++++++++++++++++++++++------------------- 1 file changed, 34 insertions(+), 22 deletions(-) diff --git a/VersionedMap.cpp b/VersionedMap.cpp index 7fd04c6..094f82b 100644 --- a/VersionedMap.cpp +++ b/VersionedMap.cpp @@ -12,37 +12,41 @@ void *mmapSafe(void *addr, size_t len, int prot, int flags, int fd, off_t offset) { void *result = mmap(addr, len, prot, flags, fd, offset); if (result == MAP_FAILED) { - int err = errno; - fprintf( - stderr, + int err = errno; // GCOVR_EXCL_LINE + fprintf( // GCOVR_EXCL_LINE + stderr, // GCOVR_EXCL_LINE "Error calling mmap(%p, %zu, %d, %d, %d, %jd): %d %s\n", // GCOVR_EXCL_LINE - addr, len, prot, flags, fd, (intmax_t)offset, err, - strerror(err)); // GCOVR_EXCL_LINE - fflush(stderr); // GCOVR_EXCL_LINE - abort(); // GCOVR_EXCL_LINE + addr, len, prot, flags, fd, (intmax_t)offset, err, // GCOVR_EXCL_LINE + strerror(err)); // GCOVR_EXCL_LINE + fflush(stderr); // GCOVR_EXCL_LINE + abort(); // GCOVR_EXCL_LINE } return result; } void mprotectSafe(void *p, size_t s, int prot) { if (mprotect(p, s, prot) != 0) { - int err = errno; // GCOVR_EXCL_LINE - fprintf(stderr, "Error calling mprotect(%p, %zu, %d): %s\n", p, s, - prot, // GCOVR_EXCL_LINE - strerror(err)); // GCOVR_EXCL_LINE - fflush(stderr); // GCOVR_EXCL_LINE - abort(); // GCOVR_EXCL_LINE + int err = errno; // GCOVR_EXCL_LINE + fprintf(stderr, // GCOVR_EXCL_LINE + "Error calling mprotect(%p, %zu, %d): %s\n", // GCOVR_EXCL_LINE + p, // GCOVR_EXCL_LINE + s, // GCOVR_EXCL_LINE + prot, // GCOVR_EXCL_LINE + strerror(err)); // GCOVR_EXCL_LINE + fflush(stderr); // GCOVR_EXCL_LINE + abort(); // GCOVR_EXCL_LINE } } void munmapSafe(void *ptr, size_t size) { if (munmap(ptr, size) != 0) { - int err = errno; // GCOVR_EXCL_LINE - fprintf(stderr, "Error calling munmap(%p, %zu): %s\n", ptr, - size, // GCOVR_EXCL_LINE - strerror(err)); // GCOVR_EXCL_LINE - fflush(stderr); // GCOVR_EXCL_LINE - abort(); // GCOVR_EXCL_LINE + int err = errno; // GCOVR_EXCL_LINE + fprintf(stderr, "Error calling munmap(%p, %zu): %s\n", // GCOVR_EXCL_LINE + ptr, // GCOVR_EXCL_LINE + size, // GCOVR_EXCL_LINE + strerror(err)); // GCOVR_EXCL_LINE + fflush(stderr); // GCOVR_EXCL_LINE + abort(); // GCOVR_EXCL_LINE } } @@ -158,13 +162,14 @@ struct MemManager { : base((Node *)mmapSafe(nullptr, kMapSize, PROT_NONE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0)) { if (kPageSize % sizeof(Node) != 0) { - fprintf(stderr, + fprintf(stderr, // GCOVR_EXCL_LINE "kPageSize not a multiple of Node size\n"); // GCOVR_EXCL_LINE abort(); // GCOVR_EXCL_LINE } if (kUpsizeBytes % kPageSize != 0) { - fprintf(stderr, "kUpsizeBytes not a multiple of kPageSize\n"); - abort(); // GCOVR_EXCL_LINE + fprintf(stderr, // GCOVR_EXCL_LINE + "kUpsizeBytes not a multiple of kPageSize\n"); // GCOVR_EXCL_LINE + abort(); // GCOVR_EXCL_LINE } } ~MemManager() { @@ -186,6 +191,13 @@ struct MemManager { mprotectSafe(base + firstUnaddressable, kUpsizeBytes, PROT_READ | PROT_WRITE); firstUnaddressable += kUpsizeNodes; + if (firstUnaddressable > kMapSize / sizeof(Node)) { + fprintf( // GCOVR_EXCL_LINE + stderr, // GCOVR_EXCL_LINE + "Out of memory: firstUnaddressable > kMapSize / " // GCOVR_EXCL_LINE + "sizeof(Node)\n"); // GCOVR_EXCL_LINE + abort(); // GCOVR_EXCL_LINE + } } return next++;