* Use std::nothrow and check the bitmap/cursor allocations.
* CID 2500 and 2501: Check the BMessage::FindData() returns. * Defensive programming: Take the bitmap/cursor BitsLength() into account when copying the data back. * Some style cleanup, automatic whitespace cleanup. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@39971 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
@@ -18,6 +18,8 @@
|
|||||||
#include <String.h>
|
#include <String.h>
|
||||||
#include <File.h>
|
#include <File.h>
|
||||||
|
|
||||||
|
#include <new>
|
||||||
|
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
\brief Constructor
|
\brief Constructor
|
||||||
@@ -174,7 +176,7 @@ CursorSet::FindCursor(BCursorID which, BBitmap **cursor, BPoint *hotspot)
|
|||||||
const void *buffer;
|
const void *buffer;
|
||||||
const char *tempstr;
|
const char *tempstr;
|
||||||
int32 bufferLength;
|
int32 bufferLength;
|
||||||
BBitmap *bmp;
|
BBitmap *bitmap;
|
||||||
BPoint hotpt;
|
BPoint hotpt;
|
||||||
|
|
||||||
if (msg.FindString("class", &tempstr) != B_OK)
|
if (msg.FindString("class", &tempstr) != B_OK)
|
||||||
@@ -184,16 +186,25 @@ CursorSet::FindCursor(BCursorID which, BBitmap **cursor, BPoint *hotspot)
|
|||||||
return B_ERROR;
|
return B_ERROR;
|
||||||
|
|
||||||
if (strcmp(tempstr, "cursor") == 0) {
|
if (strcmp(tempstr, "cursor") == 0) {
|
||||||
bmp = new BBitmap(msg.FindRect("_frame"),
|
bitmap = new(std::nothrow) BBitmap(msg.FindRect("_frame"),
|
||||||
(color_space)msg.FindInt32("_cspace"), true);
|
(color_space)msg.FindInt32("_cspace"), true);
|
||||||
msg.FindData("_data", B_RAW_TYPE, (const void **)&buffer,
|
if (bitmap == NULL)
|
||||||
(ssize_t *)&bufferLength);
|
return B_NO_MEMORY;
|
||||||
memcpy(bmp->Bits(), buffer, bufferLength);
|
|
||||||
|
|
||||||
*cursor = bmp;
|
if (msg.FindData("_data", B_RAW_TYPE, (const void **)&buffer,
|
||||||
|
(ssize_t *)&bufferLength) != B_OK) {
|
||||||
|
delete bitmap;
|
||||||
|
return B_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
memcpy(bitmap->Bits(), buffer,
|
||||||
|
min_c(bufferLength, bitmap->BitsLength()));
|
||||||
|
|
||||||
|
*cursor = bitmap;
|
||||||
*hotspot = hotpt;
|
*hotspot = hotpt;
|
||||||
return B_OK;
|
return B_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
return B_ERROR;
|
return B_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -227,14 +238,22 @@ CursorSet::FindCursor(BCursorID which, ServerCursor **_cursor) const
|
|||||||
return B_ERROR;
|
return B_ERROR;
|
||||||
|
|
||||||
if (strcmp(className, "cursor") == 0) {
|
if (strcmp(className, "cursor") == 0) {
|
||||||
ServerCursor *cursor = new ServerCursor(msg.FindRect("_frame"),
|
ServerCursor *cursor = new(std::nothrow) ServerCursor(
|
||||||
(color_space)msg.FindInt32("_cspace"), 0, hotspot);
|
msg.FindRect("_frame"), (color_space)msg.FindInt32("_cspace"), 0,
|
||||||
|
hotspot);
|
||||||
|
if (cursor == NULL)
|
||||||
|
return B_NO_MEMORY;
|
||||||
|
|
||||||
const void *buffer;
|
const void *buffer;
|
||||||
int32 bufferLength;
|
int32 bufferLength;
|
||||||
msg.FindData("_data",B_RAW_TYPE, (const void **)&buffer,
|
if (msg.FindData("_data", B_RAW_TYPE, (const void **)&buffer,
|
||||||
(ssize_t *)&bufferLength);
|
(ssize_t *)&bufferLength) != B_OK) {
|
||||||
memcpy(cursor->Bits(), buffer, bufferLength);
|
delete cursor;
|
||||||
|
return B_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
memcpy(cursor->Bits(), buffer,
|
||||||
|
min_c(bufferLength, (ssize_t)cursor->BitsLength()));
|
||||||
|
|
||||||
*_cursor = cursor;
|
*_cursor = cursor;
|
||||||
return B_OK;
|
return B_OK;
|
||||||
@@ -361,7 +380,10 @@ CursorSet::_CursorDataToBitmap(uint8 *data)
|
|||||||
// Now that we have all the setup, we're going to map (for now) the cursor
|
// Now that we have all the setup, we're going to map (for now) the cursor
|
||||||
// to RGBA32. Eventually, there will be support for 16 and 8-bit depths
|
// to RGBA32. Eventually, there will be support for 16 and 8-bit depths
|
||||||
if (data) {
|
if (data) {
|
||||||
BBitmap *bmp = new BBitmap(BRect(0,0,15,15),B_RGBA32,0);
|
BBitmap *bmp = new(std::nothrow) BBitmap(BRect(0,0,15,15),B_RGBA32,0);
|
||||||
|
if (bmp == NULL)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
uint32 black = 0xFF000000, white=0xFFFFFFFF, *bmppos;
|
uint32 black = 0xFF000000, white=0xFFFFFFFF, *bmppos;
|
||||||
uint16 *cursorpos, *maskpos, cursorflip, maskflip;
|
uint16 *cursorpos, *maskpos, cursorflip, maskflip;
|
||||||
uint16 cursorval, maskval, powval;
|
uint16 cursorval, maskval, powval;
|
||||||
@@ -392,6 +414,7 @@ CursorSet::_CursorDataToBitmap(uint8 *data)
|
|||||||
& (maskval > 0 ? 0xFFFFFFFF : 0x00FFFFFF);
|
& (maskval > 0 ? 0xFFFFFFFF : 0x00FFFFFF);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return bmp;
|
return bmp;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user