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 #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)); }
+6
View File
@@ -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));
+16
View File
@@ -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)
{ {
+3 -3
View File
@@ -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);
} }
+5 -5
View File
@@ -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);