Skip to content

Commit 3ffb6b3

Browse files
authored
Merge pull request #2129 from elBoberido/iox-2023-fix-bad-file-descriptor-error
iox-#2023 Fix bad file descriptor error
2 parents 66ee94a + c77ecbe commit 3ffb6b3

File tree

8 files changed

+44
-56
lines changed

8 files changed

+44
-56
lines changed

doc/website/release-notes/iceoryx-unreleased.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,7 @@
111111
- Fix clang-tidy errors from full-scan nightly build [#2060](https://github.com/eclipse-iceoryx/iceoryx/issues/2060)
112112
- Add public functions to create an 'access_rights' object from integer values [#2108](https://github.com/eclipse-iceoryx/iceoryx/issues/2108)
113113
- Fix `historyRequest` may be larger than `queueCapacity` during creating a subscriber [#2121](https://github.com/eclipse-iceoryx/iceoryx/issues/2121)
114+
- Unable to acquire file status due to an unknown failure [#2023](https://github.com/eclipse-iceoryx/iceoryx/issues/2023)
114115

115116
**Refactoring:**
116117

iceoryx_hoofs/posix/design/include/iox/file_management_interface.hpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ enum class FileStatError
3333
{
3434
IoFailure,
3535
FileTooLarge,
36+
BadFileDescriptor,
3637
UnknownError,
3738
};
3839

@@ -44,6 +45,7 @@ enum class FileSetOwnerError
4445
PermissionDenied,
4546
ReadOnlyFilesystem,
4647
InvalidUidOrGid,
48+
BadFileDescriptor,
4749
UnknownError,
4850
};
4951

@@ -52,6 +54,7 @@ enum class FileSetPermissionError
5254
{
5355
PermissionDenied,
5456
ReadOnlyFilesystem,
57+
BadFileDescriptor,
5558
UnknownError,
5659
};
5760

iceoryx_hoofs/posix/design/source/file_management_interface.cpp

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,9 @@ expected<iox_stat, FileStatError> get_file_status(const int fildes) noexcept
3232
{
3333
switch (result.error().errnum)
3434
{
35+
case EBADF:
36+
IOX_LOG(ERROR, "The provided file descriptor is invalid.");
37+
return err(FileStatError::BadFileDescriptor);
3538
case EIO:
3639
IOX_LOG(ERROR, "Unable to acquire file status since an io failure occurred while reading.");
3740
return err(FileStatError::IoFailure);
@@ -41,7 +44,7 @@ expected<iox_stat, FileStatError> get_file_status(const int fildes) noexcept
4144
"corresponding structure.");
4245
return err(FileStatError::FileTooLarge);
4346
default:
44-
IOX_LOG(ERROR, "Unable to acquire file status due to an unknown failure");
47+
IOX_LOG(ERROR, "Unable to acquire file status due to an unknown failure. errno: " << result.error().errnum);
4548
return err(FileStatError::UnknownError);
4649
}
4750
}
@@ -57,6 +60,9 @@ expected<void, FileSetOwnerError> set_owner(const int fildes, const uid_t uid, c
5760
{
5861
switch (result.error().errnum)
5962
{
63+
case EBADF:
64+
IOX_LOG(ERROR, "The provided file descriptor is invalid.");
65+
return err(FileSetOwnerError::BadFileDescriptor);
6066
case EPERM:
6167
IOX_LOG(ERROR, "Unable to set owner due to insufficient permissions.");
6268
return err(FileSetOwnerError::PermissionDenied);
@@ -75,7 +81,7 @@ expected<void, FileSetOwnerError> set_owner(const int fildes, const uid_t uid, c
7581
IOX_LOG(ERROR, "Unable to set owner since an interrupt was received.");
7682
return err(FileSetOwnerError::Interrupt);
7783
default:
78-
IOX_LOG(ERROR, "Unable to set owner since an unknown error occurred.");
84+
IOX_LOG(ERROR, "Unable to set owner since an unknown error occurred. errno: " << result.error().errnum);
7985
return err(FileSetOwnerError::UnknownError);
8086
}
8187
}
@@ -91,14 +97,18 @@ expected<void, FileSetPermissionError> set_permissions(const int fildes, const a
9197
{
9298
switch (result.error().errnum)
9399
{
100+
case EBADF:
101+
IOX_LOG(ERROR, "The provided file descriptor is invalid.");
102+
return err(FileSetPermissionError::BadFileDescriptor);
94103
case EPERM:
95104
IOX_LOG(ERROR, "Unable to adjust permissions due to insufficient permissions.");
96105
return err(FileSetPermissionError::PermissionDenied);
97106
case EROFS:
98107
IOX_LOG(ERROR, "Unable to adjust permissions since it is a read-only filesystem.");
99108
return err(FileSetPermissionError::ReadOnlyFilesystem);
100109
default:
101-
IOX_LOG(ERROR, "Unable to adjust permissions since an unknown error occurred.");
110+
IOX_LOG(ERROR,
111+
"Unable to adjust permissions since an unknown error occurred. errno: " << result.error().errnum);
102112
return err(FileSetPermissionError::UnknownError);
103113
}
104114
}

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(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)