summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKostya Kortchinsky <kostyak@google.com>2021-06-15 00:13:53 +0000
committerAutomerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>2021-06-15 00:13:53 +0000
commit674e5ee755317769ab49c360c6e5a95a3ce65f8a (patch)
treec8d9375af9072ed4fab7a55b8ecc12b078f519ea
parent22c655fe2e8ab40c3b69029f57acf8c520fdbd34 (diff)
parent4d022f5d4f258106f78f12d9272cf12e7059a4fd (diff)
downloadscudo-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.cpp16
-rw-r--r--standalone/common.h5
-rw-r--r--standalone/fuchsia.cpp8
-rw-r--r--standalone/linux.cpp12
-rw-r--r--standalone/string_utils.cpp12
-rw-r--r--standalone/string_utils.h1
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