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:
X512
2025-09-23 01:54:28 +00:00
committed by waddlesplash
parent db179db57b
commit b6f74b4905
5 changed files with 33 additions and 8 deletions
+3
View File
@@ -11,6 +11,7 @@
#define _LINK_RECEIVER_H
#include <AffineTransform.h>
#include <OS.h>
@@ -42,6 +43,8 @@ class LinkReceiver {
status_t ReadRegion(BRegion* region);
status_t ReadShape(BShape* shape);
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)
{ return Read(data, sizeof(Type)); }
+6
View File
@@ -11,6 +11,7 @@
#define _LINK_SENDER_H
#include <AffineTransform.h>
#include <OS.h>
@@ -43,6 +44,11 @@ class LinkSender {
status_t AttachRegion(const BRegion& region);
status_t AttachShape(BShape& shape);
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)
{
return Attach(&data, sizeof(Type));
+16
View File
@@ -58,6 +58,7 @@ public:
status_t AttachRegion(const BRegion& region);
status_t AttachShape(BShape& shape);
status_t AttachGradient(const BGradient& gradient);
status_t AttachAffineTransform(const BAffineTransform& transform);
template <class Type>
status_t Attach(const Type& data);
@@ -79,6 +80,7 @@ public:
status_t ReadRegion(BRegion* region);
status_t ReadShape(BShape* shape);
status_t ReadGradient(BGradient** _gradient);
status_t ReadAffineTransform(BAffineTransform* transform);
template <class Type>
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
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
ServerLink::Read(Type* data)
{
+3 -3
View File
@@ -1951,7 +1951,7 @@ BView::SetTransform(BAffineTransform transform)
_CheckLockAndSwitchCurrent();
fOwner->fLink->StartMessage(AS_VIEW_SET_TRANSFORM);
fOwner->fLink->Attach<BAffineTransform>(transform);
fOwner->fLink->AttachAffineTransform(transform);
fState->valid_flags |= B_VIEW_TRANSFORM_BIT;
}
@@ -1971,7 +1971,7 @@ BView::Transform() const
int32 code;
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;
}
@@ -1993,7 +1993,7 @@ BView::TransformTo(coordinate_space basis) const
int32 code;
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<BPoint>(&fState->parent_composite_origin);
}
+5 -5
View File
@@ -1614,7 +1614,7 @@ fDesktop->LockSingleWindow();
case AS_VIEW_SET_TRANSFORM:
{
BAffineTransform transform;
if (link.Read<BAffineTransform>(&transform) != B_OK)
if (link.ReadAffineTransform(&transform) != B_OK)
break;
DTRACE(("ServerWindow %s: Message AS_VIEW_SET_TRANSFORM: "
@@ -1637,7 +1637,7 @@ fDesktop->LockSingleWindow();
transform.shx, transform.sy, transform.tx, transform.ty));
fLink.StartMessage(B_OK);
fLink.Attach<BAffineTransform>(transform);
fLink.AttachAffineTransform(transform);
fLink.Flush();
break;
}
@@ -1647,11 +1647,11 @@ fDesktop->LockSingleWindow();
fLink.StartMessage(B_OK);
if (state != NULL) {
fLink.Attach<BAffineTransform>(state->CombinedTransform());
fLink.AttachAffineTransform(state->CombinedTransform());
fLink.Attach<float>(state->CombinedScale());
fLink.Attach<BPoint>(state->CombinedOrigin());
} else {
fLink.Attach<BAffineTransform>(BAffineTransform());
fLink.AttachAffineTransform(BAffineTransform());
fLink.Attach<float>(1.0f);
fLink.Attach<BPoint>(B_ORIGIN);
}
@@ -3329,7 +3329,7 @@ ServerWindow::_DispatchPictureMessage(int32 code, BPrivate::LinkReceiver& link)
case AS_VIEW_SET_TRANSFORM:
{
BAffineTransform transform;
if (link.Read<BAffineTransform>(&transform) != B_OK)
if (link.ReadAffineTransform(&transform) != B_OK)
break;
picture->WriteSetTransform(transform);