Kaydet (Commit) 6f1184df authored tarafından Jan Holesovsky's avatar Jan Holesovsky

tdf#93892: Un-share maUserBuffer when the BitmapWriteAccess is requested.

Otherwise Bad Things Happen, and we may accidentally overwrite random other / shared data.

Change-Id: I463354a6e910a2cb43faa229708fe5c14c79535a
üst 0aa9cd69
...@@ -141,9 +141,15 @@ bool OpenGLSalBitmap::Create( const SalBitmap& rSalBmp, sal_uInt16 nNewBitCount ...@@ -141,9 +141,15 @@ bool OpenGLSalBitmap::Create( const SalBitmap& rSalBmp, sal_uInt16 nNewBitCount
// execute any pending operations on the source bitmap // execute any pending operations on the source bitmap
maTexture = rSourceBitmap.GetTexture(); maTexture = rSourceBitmap.GetTexture();
mbDirtyTexture = false; mbDirtyTexture = false;
// be careful here, we are share & reference-count the
// maUserBuffer, BUT this Create() is called from
// Bitmap::ImplMakeUnique().
// Consequently, there might be cases when this needs to be made
// unique later (when we don't do that right away here), like when
// using the BitmapWriteAccess.
maUserBuffer = rSourceBitmap.maUserBuffer; maUserBuffer = rSourceBitmap.maUserBuffer;
// TODO Copy buffer data if the bitcount and palette are the same
return true; return true;
} }
return false; return false;
...@@ -649,6 +655,16 @@ BitmapBuffer* OpenGLSalBitmap::AcquireBuffer( BitmapAccessMode nMode ) ...@@ -649,6 +655,16 @@ BitmapBuffer* OpenGLSalBitmap::AcquireBuffer( BitmapAccessMode nMode )
} }
} }
// maUserBuffer must be unique when we are doing the write access
if (nMode == BITMAP_WRITE_ACCESS && maUserBuffer && !maUserBuffer.unique())
{
basebmp::RawMemorySharedArray aBuffer(maUserBuffer);
maUserBuffer.reset();
AllocateUserData();
memcpy(maUserBuffer.get(), aBuffer.get(), static_cast<sal_uInt32>(mnBytesPerRow) * mnHeight);
}
BitmapBuffer* pBuffer = new BitmapBuffer; BitmapBuffer* pBuffer = new BitmapBuffer;
pBuffer->mnWidth = mnWidth; pBuffer->mnWidth = mnWidth;
pBuffer->mnHeight = mnHeight; pBuffer->mnHeight = mnHeight;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment