summaryrefslogtreecommitdiff
path: root/src/protocols
diff options
context:
space:
mode:
authorTom Englund <tomenglund26@gmail.com>2025-05-07 18:15:27 +0200
committerGitHub <noreply@github.com>2025-05-07 18:15:27 +0200
commit0dfcba9825f1c9fb24987e9b255e8b43be4aae6d (patch)
tree223c879a0c6f06f00a91dcd32ccbf9c3b1c91e54 /src/protocols
parente5df8cdc6227e35fa225acd15cdcc75abe3347cb (diff)
DMABuffer: reserve vector and avoid UB (#10317)
actually reserve the vector instead of initializing it with the m_attrs.fd.size() adding 4 invalid fd entries, and later emplace_back the valid ones. sync_merge_data name is defined as char name[32] a fixed size array, and c++ technically doesnt allow assigning string literals directly to array fields in aggregate initializers, it may compile but is technically undefined behaviour or ill formed. zero initalise it and use std::ranges::copy_n instead.
Diffstat (limited to 'src/protocols')
-rw-r--r--src/protocols/types/DMABuffer.cpp9
1 files changed, 7 insertions, 2 deletions
diff --git a/src/protocols/types/DMABuffer.cpp b/src/protocols/types/DMABuffer.cpp
index 326c0736..0f6334e6 100644
--- a/src/protocols/types/DMABuffer.cpp
+++ b/src/protocols/types/DMABuffer.cpp
@@ -111,7 +111,9 @@ CFileDescriptor CDMABuffer::exportSyncFile() {
#if !defined(__linux__)
return {};
#else
- std::vector<CFileDescriptor> syncFds(m_attrs.fds.size());
+ std::vector<CFileDescriptor> syncFds;
+ syncFds.reserve(m_attrs.fds.size());
+
for (const auto& fd : m_attrs.fds) {
if (fd == -1)
continue;
@@ -135,12 +137,15 @@ CFileDescriptor CDMABuffer::exportSyncFile() {
continue;
}
+ const std::string name = "merged release fence";
struct sync_merge_data data{
- .name = "merged release fence",
+ .name = {}, // zero-initialize name[]
.fd2 = fd.get(),
.fence = -1,
};
+ std::ranges::copy_n(name.c_str(), std::min(name.size() + 1, sizeof(data.name)), data.name);
+
if (doIoctl(syncFd.get(), SYNC_IOC_MERGE, &data) == 0)
syncFd = CFileDescriptor(data.fence);
else