diff options
author | Kostya Kortchinsky <kostyak@google.com> | 2021-06-15 00:13:53 +0000 |
---|---|---|
committer | Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com> | 2021-06-15 00:13:53 +0000 |
commit | 674e5ee755317769ab49c360c6e5a95a3ce65f8a (patch) | |
tree | c8d9375af9072ed4fab7a55b8ecc12b078f519ea | |
parent | 22c655fe2e8ab40c3b69029f57acf8c520fdbd34 (diff) | |
parent | 4d022f5d4f258106f78f12d9272cf12e7059a4fd (diff) | |
download | scudo-674e5ee755317769ab49c360c6e5a95a3ce65f8a.tar.gz |
[scudo] Rework dieOnMapUnmapError am: 4d022f5d4f
Original change: https://googleplex-android-review.googlesource.com/c/platform/external/scudo/+/14967144
Change-Id: If2e9b5f865befdba30dc6c1b7e4308eb8532c6f6
-rw-r--r-- | standalone/common.cpp | 16 | ||||
-rw-r--r-- | standalone/common.h | 5 | ||||
-rw-r--r-- | standalone/fuchsia.cpp | 8 | ||||
-rw-r--r-- | standalone/linux.cpp | 12 | ||||
-rw-r--r-- | standalone/string_utils.cpp | 12 | ||||
-rw-r--r-- | standalone/string_utils.h | 1 |
6 files changed, 35 insertions, 19 deletions
diff --git a/standalone/common.cpp b/standalone/common.cpp index d93bfc59b3c..666f95400c7 100644 --- a/standalone/common.cpp +++ b/standalone/common.cpp @@ -8,6 +8,7 @@ #include "common.h" #include "atomic_helpers.h" +#include "string_utils.h" namespace scudo { @@ -21,11 +22,16 @@ uptr getPageSizeSlow() { } // Fatal internal map() or unmap() error (potentially OOM related). -void NORETURN dieOnMapUnmapError(bool OutOfMemory) { - outputRaw("Scudo ERROR: internal map or unmap failure"); - if (OutOfMemory) - outputRaw(" (OOM)"); - outputRaw("\n"); +void NORETURN dieOnMapUnmapError(uptr SizeIfOOM) { + char Error[128] = "Scudo ERROR: internal map or unmap failure\n"; + if (SizeIfOOM) { + formatString( + Error, sizeof(Error), + "Scudo ERROR: internal map failure (NO MEMORY) requesting %zuKB\n", + SizeIfOOM >> 10); + } + outputRaw(Error); + setAbortMessage(Error); die(); } diff --git a/standalone/common.h b/standalone/common.h index d9884dfceae..3f27a3d3e1b 100644 --- a/standalone/common.h +++ b/standalone/common.h @@ -171,8 +171,9 @@ void setMemoryPermission(uptr Addr, uptr Size, uptr Flags, void releasePagesToOS(uptr BaseAddress, uptr Offset, uptr Size, MapPlatformData *Data = nullptr); -// Internal map & unmap fatal error. This must not call map(). -void NORETURN dieOnMapUnmapError(bool OutOfMemory = false); +// Internal map & unmap fatal error. This must not call map(). SizeIfOOM shall +// hold the requested size on an out-of-memory error, 0 otherwise. +void NORETURN dieOnMapUnmapError(uptr SizeIfOOM = 0); // Logging related functions. diff --git a/standalone/fuchsia.cpp b/standalone/fuchsia.cpp index 11c1de77f17..3b473bc9e22 100644 --- a/standalone/fuchsia.cpp +++ b/standalone/fuchsia.cpp @@ -41,7 +41,7 @@ static void *allocateVmar(uptr Size, MapPlatformData *Data, bool AllowNoMem) { Size, &Data->Vmar, &Data->VmarBase); if (UNLIKELY(Status != ZX_OK)) { if (Status != ZX_ERR_NO_MEMORY || !AllowNoMem) - dieOnMapUnmapError(Status == ZX_ERR_NO_MEMORY); + dieOnMapUnmapError(Status == ZX_ERR_NO_MEMORY ? Size : 0); return nullptr; } return reinterpret_cast<void *>(Data->VmarBase); @@ -71,7 +71,7 @@ void *map(void *Addr, uptr Size, const char *Name, uptr Flags, Status = _zx_vmo_set_size(Vmo, VmoSize + Size); if (Status != ZX_OK) { if (Status != ZX_ERR_NO_MEMORY || !AllowNoMem) - dieOnMapUnmapError(Status == ZX_ERR_NO_MEMORY); + dieOnMapUnmapError(Status == ZX_ERR_NO_MEMORY ? Size : 0); return nullptr; } } else { @@ -79,7 +79,7 @@ void *map(void *Addr, uptr Size, const char *Name, uptr Flags, Status = _zx_vmo_create(Size, ZX_VMO_RESIZABLE, &Vmo); if (UNLIKELY(Status != ZX_OK)) { if (Status != ZX_ERR_NO_MEMORY || !AllowNoMem) - dieOnMapUnmapError(Status == ZX_ERR_NO_MEMORY); + dieOnMapUnmapError(Status == ZX_ERR_NO_MEMORY ? Size : 0); return nullptr; } _zx_object_set_property(Vmo, ZX_PROP_NAME, Name, strlen(Name)); @@ -105,7 +105,7 @@ void *map(void *Addr, uptr Size, const char *Name, uptr Flags, } if (UNLIKELY(Status != ZX_OK)) { if (Status != ZX_ERR_NO_MEMORY || !AllowNoMem) - dieOnMapUnmapError(Status == ZX_ERR_NO_MEMORY); + dieOnMapUnmapError(Status == ZX_ERR_NO_MEMORY ? Size : 0); return nullptr; } if (Data) diff --git a/standalone/linux.cpp b/standalone/linux.cpp index 7ec69878c0e..301bdcd34da 100644 --- a/standalone/linux.cpp +++ b/standalone/linux.cpp @@ -67,7 +67,7 @@ void *map(void *Addr, uptr Size, UNUSED const char *Name, uptr Flags, void *P = mmap(Addr, Size, MmapProt, MmapFlags, -1, 0); if (P == MAP_FAILED) { if (!(Flags & MAP_ALLOWNOMEM) || errno != ENOMEM) - dieOnMapUnmapError(errno == ENOMEM); + dieOnMapUnmapError(errno == ENOMEM ? Size : 0); return nullptr; } #if SCUDO_ANDROID @@ -91,15 +91,15 @@ void setMemoryPermission(uptr Addr, uptr Size, uptr Flags, } static bool madviseNeedsMemset() { - uptr Size = getPageSizeCached(); - char *P = (char *)mmap(0, Size, PROT_READ | PROT_WRITE, - MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); + const uptr Size = getPageSizeCached(); + char *P = reinterpret_cast<char *>(mmap(0, Size, PROT_READ | PROT_WRITE, + MAP_PRIVATE | MAP_ANONYMOUS, -1, 0)); if (!P) - dieOnMapUnmapError(errno == ENOMEM); + dieOnMapUnmapError(errno == ENOMEM ? Size : 0); *P = 1; while (madvise(P, Size, MADV_DONTNEED) == -1 && errno == EAGAIN) { } - bool R = (*P != 0); + const bool R = (*P != 0); if (munmap(P, Size) != 0) dieOnMapUnmapError(); return R; diff --git a/standalone/string_utils.cpp b/standalone/string_utils.cpp index f304491019b..25bddbce34d 100644 --- a/standalone/string_utils.cpp +++ b/standalone/string_utils.cpp @@ -115,8 +115,8 @@ static int appendPointer(char **Buffer, const char *BufferEnd, u64 ptr_value) { return Res; } -int formatString(char *Buffer, uptr BufferLength, const char *Format, - va_list Args) { +static int formatString(char *Buffer, uptr BufferLength, const char *Format, + va_list Args) { static const char *PrintfFormatsHelp = "Supported formatString formats: %([0-9]*)?(z|ll)?{d,u,x,X}; %p; " "%[-]([0-9]*)?(\\.\\*)?s; %c\n"; @@ -210,6 +210,14 @@ int formatString(char *Buffer, uptr BufferLength, const char *Format, return Res; } +int formatString(char *Buffer, uptr BufferLength, const char *Format, ...) { + va_list Args; + va_start(Args, Format); + int Res = formatString(Buffer, BufferLength, Format, Args); + va_end(Args); + return Res; +} + void ScopedString::append(const char *Format, va_list Args) { DCHECK_LT(Length, String.size()); va_list ArgsCopy; diff --git a/standalone/string_utils.h b/standalone/string_utils.h index acd60bda9d8..4880fa1e7cf 100644 --- a/standalone/string_utils.h +++ b/standalone/string_utils.h @@ -36,6 +36,7 @@ private: uptr Length; }; +int formatString(char *Buffer, uptr BufferLength, const char *Format, ...); void Printf(const char *Format, ...); } // namespace scudo |