Skip to content

Commit 7b2a570

Browse files
committed
iox-#2023 Prevent access to the shared memory file descriptor from 'PoshRuntime' opened in 'RouDi'
1 parent ec951ca commit 7b2a570

File tree

5 files changed

+27
-53
lines changed

5 files changed

+27
-53
lines changed

iceoryx_posh/include/iceoryx_posh/internal/mepoo/mepoo_segment.hpp

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
// Copyright (c) 2019 by Robert Bosch GmbH. All rights reserved.
22
// Copyright (c) 2021 by Apex.AI Inc. All rights reserved.
3+
// Copyright (c) 2023 by Mathias Kraus <[email protected]>. All rights reserved.
34
//
45
// Licensed under the Apache License, Version 2.0 (the "License");
56
// you may not use this file except in compliance with the License.
@@ -42,28 +43,28 @@ class MePooSegment
4243

4344
PosixGroup getWriterGroup() const noexcept;
4445
PosixGroup getReaderGroup() const noexcept;
45-
const SharedMemoryObjectType& getSharedMemoryObject() const noexcept;
46+
4647
MemoryManagerType& getMemoryManager() noexcept;
4748

4849
uint64_t getSegmentId() const noexcept;
4950

51+
uint64_t getSegmentSize() const noexcept;
52+
5053
protected:
5154
SharedMemoryObjectType createSharedMemoryObject(const MePooConfig& mempoolConfig,
5255
const PosixGroup& writerGroup) noexcept;
5356

5457
protected:
55-
SharedMemoryObjectType m_sharedMemoryObject;
56-
MemoryManagerType m_memoryManager;
5758
PosixGroup m_readerGroup;
5859
PosixGroup m_writerGroup;
59-
uint64_t m_segmentId;
60+
uint64_t m_segmentId{0};
61+
uint64_t m_segmentSize{0};
6062
iox::mepoo::MemoryInfo m_memoryInfo;
63+
SharedMemoryObjectType m_sharedMemoryObject;
64+
MemoryManagerType m_memoryManager;
6165

6266
static constexpr access_rights SEGMENT_PERMISSIONS =
6367
perms::owner_read | perms::owner_write | perms::group_read | perms::group_write;
64-
65-
private:
66-
void setSegmentId(const uint64_t segmentId) noexcept;
6768
};
6869
} // namespace mepoo
6970
} // namespace iox

iceoryx_posh/include/iceoryx_posh/internal/mepoo/mepoo_segment.inl

Lines changed: 10 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
// Copyright (c) 2019 by Robert Bosch GmbH. All rights reserved.
22
// Copyright (c) 2021 - 2022 by Apex.AI Inc. All rights reserved.
3+
// Copyright (c) 2023 by Mathias Kraus <[email protected]>. All rights reserved.
34
//
45
// Licensed under the Apache License, Version 2.0 (the "License");
56
// you may not use this file except in compliance with the License.
@@ -39,10 +40,10 @@ inline MePooSegment<SharedMemoryObjectType, MemoryManagerType>::MePooSegment(
3940
const PosixGroup& readerGroup,
4041
const PosixGroup& writerGroup,
4142
const iox::mepoo::MemoryInfo& memoryInfo) noexcept
42-
: m_sharedMemoryObject(std::move(createSharedMemoryObject(mempoolConfig, writerGroup)))
43-
, m_readerGroup(readerGroup)
43+
: m_readerGroup(readerGroup)
4444
, m_writerGroup(writerGroup)
4545
, m_memoryInfo(memoryInfo)
46+
, m_sharedMemoryObject(std::move(createSharedMemoryObject(mempoolConfig, writerGroup)))
4647
{
4748
using namespace detail;
4849
PosixAcl acl;
@@ -85,13 +86,13 @@ inline SharedMemoryObjectType MePooSegment<SharedMemoryObjectType, MemoryManager
8586
{
8687
errorHandler(PoshError::MEPOO__SEGMENT_INSUFFICIENT_SEGMENT_IDS);
8788
}
88-
this->setSegmentId(static_cast<uint64_t>(maybeSegmentId.value()));
89+
this->m_segmentId = static_cast<uint64_t>(maybeSegmentId.value());
90+
this->m_segmentSize = sharedMemoryObject.get_size().expect("Failed to get SHM size.");
8991

9092
IOX_LOG(DEBUG,
91-
"Roudi registered payload data segment "
92-
<< iox::log::hex(sharedMemoryObject.getBaseAddress()) << " with size "
93-
<< sharedMemoryObject.get_size().expect("Failed to get SHM size.") << " to id "
94-
<< m_segmentId);
93+
"Roudi registered payload data segment " << iox::log::hex(sharedMemoryObject.getBaseAddress())
94+
<< " with size " << m_segmentSize << " to id "
95+
<< m_segmentId);
9596
})
9697
.or_else([](auto&) { errorHandler(PoshError::MEPOO__SEGMENT_UNABLE_TO_CREATE_SHARED_MEMORY_OBJECT); })
9798
.value());
@@ -115,23 +116,16 @@ inline MemoryManagerType& MePooSegment<SharedMemoryObjectType, MemoryManagerType
115116
return m_memoryManager;
116117
}
117118

118-
template <typename SharedMemoryObjectType, typename MemoryManagerType>
119-
inline const SharedMemoryObjectType&
120-
MePooSegment<SharedMemoryObjectType, MemoryManagerType>::getSharedMemoryObject() const noexcept
121-
{
122-
return m_sharedMemoryObject;
123-
}
124-
125119
template <typename SharedMemoryObjectType, typename MemoryManagerType>
126120
inline uint64_t MePooSegment<SharedMemoryObjectType, MemoryManagerType>::getSegmentId() const noexcept
127121
{
128122
return m_segmentId;
129123
}
130124

131125
template <typename SharedMemoryObjectType, typename MemoryManagerType>
132-
inline void MePooSegment<SharedMemoryObjectType, MemoryManagerType>::setSegmentId(const uint64_t segmentId) noexcept
126+
inline uint64_t MePooSegment<SharedMemoryObjectType, MemoryManagerType>::getSegmentSize() const noexcept
133127
{
134-
m_segmentId = segmentId;
128+
return m_segmentSize;
135129
}
136130

137131
} // namespace mepoo

iceoryx_posh/include/iceoryx_posh/internal/mepoo/segment_manager.hpp

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -55,13 +55,11 @@ class SegmentManager
5555
{
5656
public:
5757
SegmentMapping(const ShmName_t& sharedMemoryName,
58-
const void* const startAddress,
5958
uint64_t size,
6059
bool isWritable,
6160
uint64_t segmentId,
6261
const iox::mepoo::MemoryInfo& memoryInfo = iox::mepoo::MemoryInfo()) noexcept
6362
: m_sharedMemoryName(sharedMemoryName)
64-
, m_startAddress(startAddress)
6563
, m_size(size)
6664
, m_isWritable(isWritable)
6765
, m_segmentId(segmentId)
@@ -71,7 +69,6 @@ class SegmentManager
7169
}
7270

7371
ShmName_t m_sharedMemoryName{""};
74-
const void* m_startAddress{nullptr};
7572
uint64_t m_size{0};
7673
bool m_isWritable{false};
7774
uint64_t m_segmentId{0};

iceoryx_posh/include/iceoryx_posh/internal/mepoo/segment_manager.inl

Lines changed: 4 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
// Copyright (c) 2019 by Robert Bosch GmbH. All rights reserved.
22
// Copyright (c) 2021 by Apex.AI Inc. All rights reserved.
3+
// Copyright (c) 2023 by Mathias Kraus <[email protected]>. All rights reserved.
34
//
45
// Licensed under the Apache License, Version 2.0 (the "License");
56
// you may not use this file except in compliance with the License.
@@ -68,11 +69,7 @@ SegmentManager<SegmentType>::getSegmentMappings(const PosixUser& user) noexcept
6869
if (!foundInWriterGroup)
6970
{
7071
mappingContainer.emplace_back(
71-
segment.getWriterGroup().getName(),
72-
segment.getSharedMemoryObject().getBaseAddress(),
73-
segment.getSharedMemoryObject().get_size().expect("failed to get SHM size"),
74-
true,
75-
segment.getSegmentId());
72+
segment.getWriterGroup().getName(), segment.getSegmentSize(), true, segment.getSegmentId());
7673
foundInWriterGroup = true;
7774
}
7875
else
@@ -91,15 +88,11 @@ SegmentManager<SegmentType>::getSegmentMappings(const PosixUser& user) noexcept
9188
// only add segments which are not yet added as writer
9289
if (segment.getReaderGroup() == groupID
9390
&& std::find_if(mappingContainer.begin(), mappingContainer.end(), [&](const SegmentMapping& mapping) {
94-
return mapping.m_startAddress == segment.getSharedMemoryObject().getBaseAddress();
91+
return mapping.m_segmentId == segment.getSegmentId();
9592
}) == mappingContainer.end())
9693
{
9794
mappingContainer.emplace_back(
98-
segment.getWriterGroup().getName(),
99-
segment.getSharedMemoryObject().getBaseAddress(),
100-
segment.getSharedMemoryObject().get_size().expect("Failed to get SHM size."),
101-
false,
102-
segment.getSegmentId());
95+
segment.getWriterGroup().getName(), segment.getSegmentSize(), false, segment.getSegmentId());
10396
}
10497
}
10598
}

iceoryx_posh/test/moduletests/test_mepoo_segment.cpp

Lines changed: 5 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
// Copyright (c) 2019 by Robert Bosch GmbH. All rights reserved.
22
// Copyright (c) 2021 - 2022 by Apex.AI Inc. All rights reserved.
3+
// Copyright (c) 2023 by Mathias Kraus <[email protected]>. All rights reserved.
34
//
45
// Licensed under the Apache License, Version 2.0 (the "License");
56
// you may not use this file except in compliance with the License.
@@ -168,25 +169,13 @@ TEST_F(MePooSegment_test, SharedMemoryCreationParameter)
168169
MePooSegment_test::SharedMemoryObject_MOCK::createFct();
169170
}
170171

171-
TEST_F(MePooSegment_test, GetSharedMemoryObject)
172+
TEST_F(MePooSegment_test, GetSegmentSize)
172173
{
173-
::testing::Test::RecordProperty("TEST_ID", "e1c12dd0-fd7d-4be3-918b-08d16a68c8e0");
174+
::testing::Test::RecordProperty("TEST_ID", "0eee50c0-251e-4313-bb35-d83a0de27ce2");
174175
GTEST_SKIP_FOR_ADDITIONAL_USER() << "This test requires the -DTEST_WITH_ADDITIONAL_USER=ON cmake argument";
175176

176-
uint64_t memorySizeInBytes{0};
177-
MePooSegment_test::SharedMemoryObject_MOCK::createVerificator = [&](const detail::PosixSharedMemory::Name_t,
178-
const uint64_t f_memorySizeInBytes,
179-
const iox::AccessMode,
180-
const iox::OpenMode,
181-
const void*,
182-
const iox::access_rights) {
183-
memorySizeInBytes = f_memorySizeInBytes;
184-
};
185-
SUT sut{mepooConfig, m_managementAllocator, PosixGroup{"iox_roudi_test1"}, PosixGroup{"iox_roudi_test2"}};
186-
MePooSegment_test::SharedMemoryObject_MOCK::createVerificator =
187-
MePooSegment_test::SharedMemoryObject_MOCK::createFct();
188-
189-
EXPECT_THAT(sut.getSharedMemoryObject().get_size().expect("Failed to get SHM size"), Eq(memorySizeInBytes));
177+
auto sut = createSut();
178+
EXPECT_THAT(sut->getSegmentSize(), Eq(MemoryManager::requiredChunkMemorySize(mepooConfig)));
190179
}
191180

192181
TEST_F(MePooSegment_test, GetReaderGroup)

0 commit comments

Comments
 (0)