From b5be469eee595f20dc4ff094869fe16611953151 Mon Sep 17 00:00:00 2001 From: Adrien Destugues Date: Thu, 15 Aug 2019 18:01:32 +0200 Subject: [PATCH] app_server: some missing std::nothrow and error checks. I had app_server crash on me because of an uncaught allocation exception. I don't know if this will fix it but it's better to try to survive even if it may result in some UI glitches. Change-Id: I09dd2a7e6ff63d52f51389d7418d1a1d1810af00 Reviewed-on: https://review.haiku-os.org/c/haiku/+/1720 Reviewed-by: waddlesplash --- src/servers/app/drawing/DrawingEngine.cpp | 11 ++++++++--- src/servers/app/drawing/HWInterface.cpp | 8 +++++++- src/servers/app/drawing/HWInterface.h | 4 +++- 3 files changed, 18 insertions(+), 5 deletions(-) diff --git a/src/servers/app/drawing/DrawingEngine.cpp b/src/servers/app/drawing/DrawingEngine.cpp index d3df91dc49..c4e50f6da0 100644 --- a/src/servers/app/drawing/DrawingEngine.cpp +++ b/src/servers/app/drawing/DrawingEngine.cpp @@ -428,7 +428,7 @@ struct node { void init(const BRect& r, int32 maxPointers) { rect = r; - pointers = new node*[maxPointers]; + pointers = new(std::nothrow) node*[maxPointers]; in_degree = 0; next_pointer = 0; } @@ -490,6 +490,8 @@ DrawingEngine::CopyRegion(/*const*/ BRegion* region, int32 xOffset, BStackOrHeapArray nodes(count); for (int32 i= 0; i < count; i++) { nodes[i].init(region->RectAt(i), count); + if (nodes[i].pointers == NULL) + return; } for (int32 i = 0; i < count; i++) { @@ -551,8 +553,11 @@ DrawingEngine::CopyRegion(/*const*/ BRegion* region, int32 xOffset, clipping_rect* sortedRectList = NULL; int32 nextSortedIndex = 0; - if (fAvailableHWAccleration & HW_ACC_COPY_REGION) - sortedRectList = new clipping_rect[count]; + if (fAvailableHWAccleration & HW_ACC_COPY_REGION) { + sortedRectList = new(std::nothrow) clipping_rect[count]; + if (sortedRectList == NULL) + return; + } while (!inDegreeZeroNodes.empty()) { node* n = inDegreeZeroNodes.top(); diff --git a/src/servers/app/drawing/HWInterface.cpp b/src/servers/app/drawing/HWInterface.cpp index cf9a67223a..e98bc51deb 100644 --- a/src/servers/app/drawing/HWInterface.cpp +++ b/src/servers/app/drawing/HWInterface.cpp @@ -586,8 +586,10 @@ HWInterface::_DrawCursor(IntRect area) const // that has the cursor blended on top of it // blending buffer - uint8* buffer = new uint8[width * height * 4]; + uint8* buffer = new(std::nothrow) uint8[width * height * 4]; // TODO: cache this buffer + if (buffer == NULL) + return; // offset into back buffer uint8* src = (uint8*)backBuffer->Bits(); @@ -1085,6 +1087,10 @@ HWInterface::_AdoptDragBitmap(const ServerBitmap* bitmap, const BPoint& offset) BRect cursorBounds = fCursorAndDragBitmap->Bounds(); fCursorAreaBackup = new buffer_clip(cursorBounds.IntegerWidth() + 1, cursorBounds.IntegerHeight() + 1); + if (fCursorAreaBackup->buffer == NULL) { + delete fCursorAreaBackup; + fCursorAreaBackup = NULL; + } } _DrawCursor(_CursorFrame()); } diff --git a/src/servers/app/drawing/HWInterface.h b/src/servers/app/drawing/HWInterface.h index aaf79194a0..11242f06c4 100644 --- a/src/servers/app/drawing/HWInterface.h +++ b/src/servers/app/drawing/HWInterface.h @@ -18,6 +18,8 @@ #include +#include + #include "IntRect.h" #include "MultiLocker.h" #include "ServerCursor.h" @@ -224,7 +226,7 @@ protected: { bpr = width * 4; if (bpr > 0 && height > 0) - buffer = new uint8[bpr * height]; + buffer = new(std::nothrow) uint8[bpr * height]; else buffer = NULL; left = 0;