mirror of
https://github.com/Atmosphere-NX/Atmosphere.git
synced 2024-11-22 20:06:40 +00:00
sf: fix ipc serialization bug (out object id offsets)
This commit is contained in:
parent
812b2aeb4c
commit
742fd16080
3 changed files with 20 additions and 15 deletions
|
@ -62,7 +62,7 @@ namespace ams::sf::cmif {
|
||||||
}
|
}
|
||||||
|
|
||||||
constexpr size_t GetImplOutDataTotalSize() const {
|
constexpr size_t GetImplOutDataTotalSize() const {
|
||||||
return m_impl_metadata.GetOutDataSize() + m_impl_metadata.GetOutHeadersSize();
|
return m_impl_metadata.GetUnalignedOutDataSize() + m_impl_metadata.GetOutHeadersSize();
|
||||||
}
|
}
|
||||||
public:
|
public:
|
||||||
/* Used to enabled templated message processors. */
|
/* Used to enabled templated message processors. */
|
||||||
|
@ -80,12 +80,12 @@ namespace ams::sf::cmif {
|
||||||
const auto runtime_metadata = m_impl_processor->GetRuntimeMetadata();
|
const auto runtime_metadata = m_impl_processor->GetRuntimeMetadata();
|
||||||
|
|
||||||
return ServerMessageRuntimeMetadata {
|
return ServerMessageRuntimeMetadata {
|
||||||
.in_data_size = static_cast<u16>(runtime_metadata.GetInDataSize() + runtime_metadata.GetInObjectCount() * sizeof(DomainObjectId)),
|
.in_data_size = static_cast<u16>(runtime_metadata.GetInDataSize() + runtime_metadata.GetInObjectCount() * sizeof(DomainObjectId)),
|
||||||
.out_data_size = static_cast<u16>(runtime_metadata.GetOutDataSize() + runtime_metadata.GetOutObjectCount() * sizeof(DomainObjectId)),
|
.unaligned_out_data_size = static_cast<u16>(runtime_metadata.GetOutDataSize() + runtime_metadata.GetOutObjectCount() * sizeof(DomainObjectId)),
|
||||||
.in_headers_size = static_cast<u8>(runtime_metadata.GetInHeadersSize() + sizeof(CmifDomainInHeader)),
|
.in_headers_size = static_cast<u8>(runtime_metadata.GetInHeadersSize() + sizeof(CmifDomainInHeader)),
|
||||||
.out_headers_size = static_cast<u8>(runtime_metadata.GetOutHeadersSize() + sizeof(CmifDomainOutHeader)),
|
.out_headers_size = static_cast<u8>(runtime_metadata.GetOutHeadersSize() + sizeof(CmifDomainOutHeader)),
|
||||||
.in_object_count = 0,
|
.in_object_count = 0,
|
||||||
.out_object_count = 0,
|
.out_object_count = 0,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -28,7 +28,7 @@ namespace ams::sf::cmif {
|
||||||
/* This is needed for non-templated domain message processing. */
|
/* This is needed for non-templated domain message processing. */
|
||||||
struct ServerMessageRuntimeMetadata {
|
struct ServerMessageRuntimeMetadata {
|
||||||
u16 in_data_size;
|
u16 in_data_size;
|
||||||
u16 out_data_size;
|
u16 unaligned_out_data_size;
|
||||||
u8 in_headers_size;
|
u8 in_headers_size;
|
||||||
u8 out_headers_size;
|
u8 out_headers_size;
|
||||||
u8 in_object_count;
|
u8 in_object_count;
|
||||||
|
@ -39,7 +39,11 @@ namespace ams::sf::cmif {
|
||||||
}
|
}
|
||||||
|
|
||||||
constexpr size_t GetOutDataSize() const {
|
constexpr size_t GetOutDataSize() const {
|
||||||
return static_cast<size_t>(this->out_data_size);
|
return static_cast<size_t>(util::AlignUp(this->unaligned_out_data_size, sizeof(u32)));
|
||||||
|
}
|
||||||
|
|
||||||
|
constexpr size_t GetUnalignedOutDataSize() const {
|
||||||
|
return static_cast<size_t>(this->unaligned_out_data_size);
|
||||||
}
|
}
|
||||||
|
|
||||||
constexpr size_t GetInHeadersSize() const {
|
constexpr size_t GetInHeadersSize() const {
|
||||||
|
|
|
@ -472,6 +472,7 @@ namespace ams::sf::impl {
|
||||||
static constexpr size_t InDataSize = util::AlignUp(InDataOffsets[NumInDatas], alignof(u16));
|
static constexpr size_t InDataSize = util::AlignUp(InDataOffsets[NumInDatas], alignof(u16));
|
||||||
|
|
||||||
static constexpr std::array<size_t, NumOutDatas+1> OutDataOffsets = RawDataOffsetCalculator<OutDatas>::Offsets;
|
static constexpr std::array<size_t, NumOutDatas+1> OutDataOffsets = RawDataOffsetCalculator<OutDatas>::Offsets;
|
||||||
|
static constexpr size_t UnalignedOutDataSize = OutDataOffsets[NumOutDatas];
|
||||||
static constexpr size_t OutDataSize = util::AlignUp(OutDataOffsets[NumOutDatas], alignof(u32));
|
static constexpr size_t OutDataSize = util::AlignUp(OutDataOffsets[NumOutDatas], alignof(u32));
|
||||||
static constexpr size_t OutDataAlign = [] {
|
static constexpr size_t OutDataAlign = [] {
|
||||||
if constexpr (std::tuple_size<OutDatas>::value) {
|
if constexpr (std::tuple_size<OutDatas>::value) {
|
||||||
|
@ -492,12 +493,12 @@ namespace ams::sf::impl {
|
||||||
|
|
||||||
/* Used by server message processor at runtime. */
|
/* Used by server message processor at runtime. */
|
||||||
static constexpr inline const cmif::ServerMessageRuntimeMetadata RuntimeMetadata = cmif::ServerMessageRuntimeMetadata{
|
static constexpr inline const cmif::ServerMessageRuntimeMetadata RuntimeMetadata = cmif::ServerMessageRuntimeMetadata{
|
||||||
.in_data_size = InDataSize,
|
.in_data_size = InDataSize,
|
||||||
.out_data_size = OutDataSize,
|
.unaligned_out_data_size = UnalignedOutDataSize,
|
||||||
.in_headers_size = sizeof(CmifInHeader),
|
.in_headers_size = sizeof(CmifInHeader),
|
||||||
.out_headers_size = sizeof(CmifOutHeader),
|
.out_headers_size = sizeof(CmifOutHeader),
|
||||||
.in_object_count = NumInObjects,
|
.in_object_count = NumInObjects,
|
||||||
.out_object_count = NumOutObjects,
|
.out_object_count = NumOutObjects,
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Construction of argument serialization structs. */
|
/* Construction of argument serialization structs. */
|
||||||
|
|
Loading…
Reference in a new issue