app_server: do not pass BAffineTransform as-is over server link
BAffineTransform is not POD type and contains vtable. Reading it from byte stream as-is will cause vtable corruption. Change-Id: I1371444444ffa47f77a88f5f82b3fe6ea031b14c Reviewed-on: https://review.haiku-os.org/c/haiku/+/9660 Reviewed-by: waddlesplash <[email protected]> Tested-by: Commit checker robot <[email protected]>
This commit is contained in:
@@ -11,6 +11,7 @@
|
|||||||
#define _LINK_RECEIVER_H
|
#define _LINK_RECEIVER_H
|
||||||
|
|
||||||
|
|
||||||
|
#include <AffineTransform.h>
|
||||||
#include <OS.h>
|
#include <OS.h>
|
||||||
|
|
||||||
|
|
||||||
@@ -42,6 +43,8 @@ class LinkReceiver {
|
|||||||
status_t ReadRegion(BRegion* region);
|
status_t ReadRegion(BRegion* region);
|
||||||
status_t ReadShape(BShape* shape);
|
status_t ReadShape(BShape* shape);
|
||||||
status_t ReadGradient(BGradient** gradient);
|
status_t ReadGradient(BGradient** gradient);
|
||||||
|
status_t ReadAffineTransform(BAffineTransform *transform)
|
||||||
|
{ return Read(&transform->sx, sizeof(double) * 6); }
|
||||||
|
|
||||||
template <class Type> status_t Read(Type *data)
|
template <class Type> status_t Read(Type *data)
|
||||||
{ return Read(data, sizeof(Type)); }
|
{ return Read(data, sizeof(Type)); }
|
||||||
|
|||||||
@@ -11,6 +11,7 @@
|
|||||||
#define _LINK_SENDER_H
|
#define _LINK_SENDER_H
|
||||||
|
|
||||||
|
|
||||||
|
#include <AffineTransform.h>
|
||||||
#include <OS.h>
|
#include <OS.h>
|
||||||
|
|
||||||
|
|
||||||
@@ -43,6 +44,11 @@ class LinkSender {
|
|||||||
status_t AttachRegion(const BRegion& region);
|
status_t AttachRegion(const BRegion& region);
|
||||||
status_t AttachShape(BShape& shape);
|
status_t AttachShape(BShape& shape);
|
||||||
status_t AttachGradient(const BGradient& gradient);
|
status_t AttachGradient(const BGradient& gradient);
|
||||||
|
status_t AttachAffineTransform(const BAffineTransform& transform)
|
||||||
|
{
|
||||||
|
return Attach(&transform.sx, sizeof(double) * 6);
|
||||||
|
}
|
||||||
|
|
||||||
template <class Type> status_t Attach(const Type& data)
|
template <class Type> status_t Attach(const Type& data)
|
||||||
{
|
{
|
||||||
return Attach(&data, sizeof(Type));
|
return Attach(&data, sizeof(Type));
|
||||||
|
|||||||
@@ -58,6 +58,7 @@ public:
|
|||||||
status_t AttachRegion(const BRegion& region);
|
status_t AttachRegion(const BRegion& region);
|
||||||
status_t AttachShape(BShape& shape);
|
status_t AttachShape(BShape& shape);
|
||||||
status_t AttachGradient(const BGradient& gradient);
|
status_t AttachGradient(const BGradient& gradient);
|
||||||
|
status_t AttachAffineTransform(const BAffineTransform& transform);
|
||||||
|
|
||||||
template <class Type>
|
template <class Type>
|
||||||
status_t Attach(const Type& data);
|
status_t Attach(const Type& data);
|
||||||
@@ -79,6 +80,7 @@ public:
|
|||||||
status_t ReadRegion(BRegion* region);
|
status_t ReadRegion(BRegion* region);
|
||||||
status_t ReadShape(BShape* shape);
|
status_t ReadShape(BShape* shape);
|
||||||
status_t ReadGradient(BGradient** _gradient);
|
status_t ReadGradient(BGradient** _gradient);
|
||||||
|
status_t ReadAffineTransform(BAffineTransform* transform);
|
||||||
|
|
||||||
template <class Type>
|
template <class Type>
|
||||||
status_t Read(Type* data);
|
status_t Read(Type* data);
|
||||||
@@ -189,6 +191,13 @@ ServerLink::AttachGradient(const BGradient& gradient)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline status_t
|
||||||
|
ServerLink::AttachAffineTransform(const BAffineTransform& transform)
|
||||||
|
{
|
||||||
|
return fSender->AttachAffineTransform(transform);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
template<class Type> status_t
|
template<class Type> status_t
|
||||||
ServerLink::Attach(const Type& data)
|
ServerLink::Attach(const Type& data)
|
||||||
{
|
{
|
||||||
@@ -276,6 +285,13 @@ ServerLink::ReadGradient(BGradient** _gradient)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline status_t
|
||||||
|
ServerLink::ReadAffineTransform(BAffineTransform* transform)
|
||||||
|
{
|
||||||
|
return fReceiver->ReadAffineTransform(transform);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
template <class Type> status_t
|
template <class Type> status_t
|
||||||
ServerLink::Read(Type* data)
|
ServerLink::Read(Type* data)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1951,7 +1951,7 @@ BView::SetTransform(BAffineTransform transform)
|
|||||||
_CheckLockAndSwitchCurrent();
|
_CheckLockAndSwitchCurrent();
|
||||||
|
|
||||||
fOwner->fLink->StartMessage(AS_VIEW_SET_TRANSFORM);
|
fOwner->fLink->StartMessage(AS_VIEW_SET_TRANSFORM);
|
||||||
fOwner->fLink->Attach<BAffineTransform>(transform);
|
fOwner->fLink->AttachAffineTransform(transform);
|
||||||
|
|
||||||
fState->valid_flags |= B_VIEW_TRANSFORM_BIT;
|
fState->valid_flags |= B_VIEW_TRANSFORM_BIT;
|
||||||
}
|
}
|
||||||
@@ -1971,7 +1971,7 @@ BView::Transform() const
|
|||||||
|
|
||||||
int32 code;
|
int32 code;
|
||||||
if (fOwner->fLink->FlushWithReply(code) == B_OK && code == B_OK)
|
if (fOwner->fLink->FlushWithReply(code) == B_OK && code == B_OK)
|
||||||
fOwner->fLink->Read<BAffineTransform>(&fState->transform);
|
fOwner->fLink->ReadAffineTransform(&fState->transform);
|
||||||
|
|
||||||
fState->valid_flags |= B_VIEW_TRANSFORM_BIT;
|
fState->valid_flags |= B_VIEW_TRANSFORM_BIT;
|
||||||
}
|
}
|
||||||
@@ -1993,7 +1993,7 @@ BView::TransformTo(coordinate_space basis) const
|
|||||||
|
|
||||||
int32 code;
|
int32 code;
|
||||||
if (fOwner->fLink->FlushWithReply(code) == B_OK && code == B_OK) {
|
if (fOwner->fLink->FlushWithReply(code) == B_OK && code == B_OK) {
|
||||||
fOwner->fLink->Read<BAffineTransform>(&fState->parent_composite_transform);
|
fOwner->fLink->ReadAffineTransform(&fState->parent_composite_transform);
|
||||||
fOwner->fLink->Read<float>(&fState->parent_composite_scale);
|
fOwner->fLink->Read<float>(&fState->parent_composite_scale);
|
||||||
fOwner->fLink->Read<BPoint>(&fState->parent_composite_origin);
|
fOwner->fLink->Read<BPoint>(&fState->parent_composite_origin);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1614,7 +1614,7 @@ fDesktop->LockSingleWindow();
|
|||||||
case AS_VIEW_SET_TRANSFORM:
|
case AS_VIEW_SET_TRANSFORM:
|
||||||
{
|
{
|
||||||
BAffineTransform transform;
|
BAffineTransform transform;
|
||||||
if (link.Read<BAffineTransform>(&transform) != B_OK)
|
if (link.ReadAffineTransform(&transform) != B_OK)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
DTRACE(("ServerWindow %s: Message AS_VIEW_SET_TRANSFORM: "
|
DTRACE(("ServerWindow %s: Message AS_VIEW_SET_TRANSFORM: "
|
||||||
@@ -1637,7 +1637,7 @@ fDesktop->LockSingleWindow();
|
|||||||
transform.shx, transform.sy, transform.tx, transform.ty));
|
transform.shx, transform.sy, transform.tx, transform.ty));
|
||||||
|
|
||||||
fLink.StartMessage(B_OK);
|
fLink.StartMessage(B_OK);
|
||||||
fLink.Attach<BAffineTransform>(transform);
|
fLink.AttachAffineTransform(transform);
|
||||||
fLink.Flush();
|
fLink.Flush();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -1647,11 +1647,11 @@ fDesktop->LockSingleWindow();
|
|||||||
|
|
||||||
fLink.StartMessage(B_OK);
|
fLink.StartMessage(B_OK);
|
||||||
if (state != NULL) {
|
if (state != NULL) {
|
||||||
fLink.Attach<BAffineTransform>(state->CombinedTransform());
|
fLink.AttachAffineTransform(state->CombinedTransform());
|
||||||
fLink.Attach<float>(state->CombinedScale());
|
fLink.Attach<float>(state->CombinedScale());
|
||||||
fLink.Attach<BPoint>(state->CombinedOrigin());
|
fLink.Attach<BPoint>(state->CombinedOrigin());
|
||||||
} else {
|
} else {
|
||||||
fLink.Attach<BAffineTransform>(BAffineTransform());
|
fLink.AttachAffineTransform(BAffineTransform());
|
||||||
fLink.Attach<float>(1.0f);
|
fLink.Attach<float>(1.0f);
|
||||||
fLink.Attach<BPoint>(B_ORIGIN);
|
fLink.Attach<BPoint>(B_ORIGIN);
|
||||||
}
|
}
|
||||||
@@ -3329,7 +3329,7 @@ ServerWindow::_DispatchPictureMessage(int32 code, BPrivate::LinkReceiver& link)
|
|||||||
case AS_VIEW_SET_TRANSFORM:
|
case AS_VIEW_SET_TRANSFORM:
|
||||||
{
|
{
|
||||||
BAffineTransform transform;
|
BAffineTransform transform;
|
||||||
if (link.Read<BAffineTransform>(&transform) != B_OK)
|
if (link.ReadAffineTransform(&transform) != B_OK)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
picture->WriteSetTransform(transform);
|
picture->WriteSetTransform(transform);
|
||||||
|
|||||||
Reference in New Issue
Block a user