Kaydet (Commit) 90bbc7ea authored tarafından Jan Holesovsky's avatar Jan Holesovsky Kaydeden (comit) Miklos Vajna

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
Reviewed-on: https://gerrit.libreoffice.org/18309Reviewed-by: 's avatarMiklos Vajna <vmiklos@collabora.co.uk>
Tested-by: 's avatarMiklos Vajna <vmiklos@collabora.co.uk>
üst 8275af08
......@@ -141,9 +141,15 @@ bool OpenGLSalBitmap::Create( const SalBitmap& rSalBmp, sal_uInt16 nNewBitCount
// execute any pending operations on the source bitmap
maTexture = rSourceBitmap.GetTexture();
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;
// TODO Copy buffer data if the bitcount and palette are the same
return true;
}
return false;
......@@ -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;
pBuffer->mnWidth = mnWidth;
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