diff --git a/include/libcamera/internal/ipa_data_serializer.h b/include/libcamera/internal/ipa_data_serializer.h index 519093bd..4353e07b 100644 --- a/include/libcamera/internal/ipa_data_serializer.h +++ b/include/libcamera/internal/ipa_data_serializer.h @@ -66,7 +66,7 @@ template class IPADataSerializer { public: - static std::tuple, std::vector> + static std::tuple, std::vector> serialize(const T &data, ControlSerializer *cs = nullptr); static T deserialize(const std::vector &data, @@ -76,12 +76,12 @@ public: ControlSerializer *cs = nullptr); static T deserialize(const std::vector &data, - const std::vector &fds, + const std::vector &fds, ControlSerializer *cs = nullptr); static T deserialize(std::vector::const_iterator dataBegin, std::vector::const_iterator dataEnd, - std::vector::const_iterator fdsBegin, - std::vector::const_iterator fdsEnd, + std::vector::const_iterator fdsBegin, + std::vector::const_iterator fdsEnd, ControlSerializer *cs = nullptr); }; @@ -104,11 +104,11 @@ template class IPADataSerializer> { public: - static std::tuple, std::vector> + static std::tuple, std::vector> serialize(const std::vector &data, ControlSerializer *cs = nullptr) { std::vector dataVec; - std::vector fdsVec; + std::vector fdsVec; /* Serialize the length. */ uint32_t vecLen = data.size(); @@ -117,7 +117,7 @@ public: /* Serialize the members. */ for (auto const &it : data) { std::vector dvec; - std::vector fvec; + std::vector fvec; std::tie(dvec, fvec) = IPADataSerializer::serialize(it, cs); @@ -141,11 +141,11 @@ public: std::vector::const_iterator dataEnd, ControlSerializer *cs = nullptr) { - std::vector fds; + std::vector fds; return deserialize(dataBegin, dataEnd, fds.cbegin(), fds.end(), cs); } - static std::vector deserialize(std::vector &data, std::vector &fds, + static std::vector deserialize(std::vector &data, std::vector &fds, ControlSerializer *cs = nullptr) { return deserialize(data.cbegin(), data.end(), fds.cbegin(), fds.end(), cs); @@ -153,15 +153,15 @@ public: static std::vector deserialize(std::vector::const_iterator dataBegin, std::vector::const_iterator dataEnd, - std::vector::const_iterator fdsBegin, - [[maybe_unused]] std::vector::const_iterator fdsEnd, + std::vector::const_iterator fdsBegin, + [[maybe_unused]] std::vector::const_iterator fdsEnd, ControlSerializer *cs = nullptr) { uint32_t vecLen = readPOD(dataBegin, 0, dataEnd); std::vector ret(vecLen); std::vector::const_iterator dataIter = dataBegin + 4; - std::vector::const_iterator fdIter = fdsBegin; + std::vector::const_iterator fdIter = fdsBegin; for (uint32_t i = 0; i < vecLen; i++) { uint32_t sizeofData = readPOD(dataIter, 0, dataEnd); uint32_t sizeofFds = readPOD(dataIter, 4, dataEnd); @@ -201,11 +201,11 @@ template class IPADataSerializer> { public: - static std::tuple, std::vector> + static std::tuple, std::vector> serialize(const std::map &data, ControlSerializer *cs = nullptr) { std::vector dataVec; - std::vector fdsVec; + std::vector fdsVec; /* Serialize the length. */ uint32_t mapLen = data.size(); @@ -214,7 +214,7 @@ public: /* Serialize the members. */ for (auto const &it : data) { std::vector dvec; - std::vector fvec; + std::vector fvec; std::tie(dvec, fvec) = IPADataSerializer::serialize(it.first, cs); @@ -247,11 +247,11 @@ public: std::vector::const_iterator dataEnd, ControlSerializer *cs = nullptr) { - std::vector fds; + std::vector fds; return deserialize(dataBegin, dataEnd, fds.cbegin(), fds.end(), cs); } - static std::map deserialize(std::vector &data, std::vector &fds, + static std::map deserialize(std::vector &data, std::vector &fds, ControlSerializer *cs = nullptr) { return deserialize(data.cbegin(), data.end(), fds.cbegin(), fds.end(), cs); @@ -259,8 +259,8 @@ public: static std::map deserialize(std::vector::const_iterator dataBegin, std::vector::const_iterator dataEnd, - std::vector::const_iterator fdsBegin, - [[maybe_unused]] std::vector::const_iterator fdsEnd, + std::vector::const_iterator fdsBegin, + [[maybe_unused]] std::vector::const_iterator fdsEnd, ControlSerializer *cs = nullptr) { std::map ret; @@ -268,7 +268,7 @@ public: uint32_t mapLen = readPOD(dataBegin, 0, dataEnd); std::vector::const_iterator dataIter = dataBegin + 4; - std::vector::const_iterator fdIter = fdsBegin; + std::vector::const_iterator fdIter = fdsBegin; for (uint32_t i = 0; i < mapLen; i++) { uint32_t sizeofData = readPOD(dataIter, 0, dataEnd); uint32_t sizeofFds = readPOD(dataIter, 4, dataEnd); diff --git a/include/libcamera/internal/ipc_pipe.h b/include/libcamera/internal/ipc_pipe.h index e58de340..52cc8fa3 100644 --- a/include/libcamera/internal/ipc_pipe.h +++ b/include/libcamera/internal/ipc_pipe.h @@ -11,6 +11,8 @@ #include +#include + #include "libcamera/internal/ipc_unixsocket.h" namespace libcamera { @@ -26,23 +28,23 @@ public: IPCMessage(); IPCMessage(uint32_t cmd); IPCMessage(const Header &header); - IPCMessage(const IPCUnixSocket::Payload &payload); + IPCMessage(IPCUnixSocket::Payload &payload); IPCUnixSocket::Payload payload() const; Header &header() { return header_; } std::vector &data() { return data_; } - std::vector &fds() { return fds_; } + std::vector &fds() { return fds_; } const Header &header() const { return header_; } const std::vector &data() const { return data_; } - const std::vector &fds() const { return fds_; } + const std::vector &fds() const { return fds_; } private: Header header_; std::vector data_; - std::vector fds_; + std::vector fds_; }; class IPCPipe diff --git a/src/libcamera/ipa_data_serializer.cpp b/src/libcamera/ipa_data_serializer.cpp index fb941e6b..5b183c70 100644 --- a/src/libcamera/ipa_data_serializer.cpp +++ b/src/libcamera/ipa_data_serializer.cpp @@ -7,6 +7,8 @@ #include "libcamera/internal/ipa_data_serializer.h" +#include + #include /** @@ -141,7 +143,7 @@ namespace { /** * \fn template IPADataSerializer::deserialize( * const std::vector &data, - * const std::vector &fds, + * const std::vector &fds, * ControlSerializer *cs = nullptr) * \brief Deserialize byte vector and fd vector into an object * \tparam T Type of object to deserialize to @@ -162,8 +164,8 @@ namespace { * \fn template IPADataSerializer::deserialize( * std::vector::const_iterator dataBegin, * std::vector::const_iterator dataEnd, - * std::vector::const_iterator fdsBegin, - * std::vector::const_iterator fdsEnd, + * std::vector::const_iterator fdsBegin, + * std::vector::const_iterator fdsEnd, * ControlSerializer *cs = nullptr) * \brief Deserialize byte vector and fd vector into an object * \tparam T Type of object to deserialize to @@ -187,7 +189,7 @@ namespace { #define DEFINE_POD_SERIALIZER(type) \ \ template<> \ -std::tuple, std::vector> \ +std::tuple, std::vector> \ IPADataSerializer::serialize(const type &data, \ [[maybe_unused]] ControlSerializer *cs) \ { \ @@ -215,7 +217,7 @@ type IPADataSerializer::deserialize(const std::vector &data, \ \ template<> \ type IPADataSerializer::deserialize(const std::vector &data, \ - [[maybe_unused]] const std::vector &fds, \ + [[maybe_unused]] const std::vector &fds, \ ControlSerializer *cs) \ { \ return deserialize(data.cbegin(), data.end(), cs); \ @@ -224,8 +226,8 @@ type IPADataSerializer::deserialize(const std::vector &data, \ template<> \ type IPADataSerializer::deserialize(std::vector::const_iterator dataBegin, \ std::vector::const_iterator dataEnd, \ - [[maybe_unused]] std::vector::const_iterator fdsBegin, \ - [[maybe_unused]] std::vector::const_iterator fdsEnd, \ + [[maybe_unused]] std::vector::const_iterator fdsBegin, \ + [[maybe_unused]] std::vector::const_iterator fdsEnd, \ ControlSerializer *cs) \ { \ return deserialize(dataBegin, dataEnd, cs); \ @@ -249,7 +251,7 @@ DEFINE_POD_SERIALIZER(double) * function parameter serdes). */ template<> -std::tuple, std::vector> +std::tuple, std::vector> IPADataSerializer::serialize(const std::string &data, [[maybe_unused]] ControlSerializer *cs) { @@ -276,7 +278,7 @@ IPADataSerializer::deserialize(std::vector::const_iterator template<> std::string IPADataSerializer::deserialize(const std::vector &data, - [[maybe_unused]] const std::vector &fds, + [[maybe_unused]] const std::vector &fds, [[maybe_unused]] ControlSerializer *cs) { return { data.cbegin(), data.cend() }; @@ -286,8 +288,8 @@ template<> std::string IPADataSerializer::deserialize(std::vector::const_iterator dataBegin, std::vector::const_iterator dataEnd, - [[maybe_unused]] std::vector::const_iterator fdsBegin, - [[maybe_unused]] std::vector::const_iterator fdsEnd, + [[maybe_unused]] std::vector::const_iterator fdsBegin, + [[maybe_unused]] std::vector::const_iterator fdsEnd, [[maybe_unused]] ControlSerializer *cs) { return { dataBegin, dataEnd }; @@ -305,7 +307,7 @@ IPADataSerializer::deserialize(std::vector::const_iterator * be used. The serialized ControlInfoMap will have zero length. */ template<> -std::tuple, std::vector> +std::tuple, std::vector> IPADataSerializer::serialize(const ControlList &data, ControlSerializer *cs) { if (!cs) @@ -405,7 +407,7 @@ IPADataSerializer::deserialize(const std::vector &data, template<> ControlList IPADataSerializer::deserialize(const std::vector &data, - [[maybe_unused]] const std::vector &fds, + [[maybe_unused]] const std::vector &fds, ControlSerializer *cs) { return deserialize(data.cbegin(), data.end(), cs); @@ -415,8 +417,8 @@ template<> ControlList IPADataSerializer::deserialize(std::vector::const_iterator dataBegin, std::vector::const_iterator dataEnd, - [[maybe_unused]] std::vector::const_iterator fdsBegin, - [[maybe_unused]] std::vector::const_iterator fdsEnd, + [[maybe_unused]] std::vector::const_iterator fdsBegin, + [[maybe_unused]] std::vector::const_iterator fdsEnd, ControlSerializer *cs) { return deserialize(dataBegin, dataEnd, cs); @@ -429,7 +431,7 @@ IPADataSerializer::deserialize(std::vector::const_iterator * X bytes - Serialized ControlInfoMap (using ControlSerializer) */ template<> -std::tuple, std::vector> +std::tuple, std::vector> IPADataSerializer::serialize(const ControlInfoMap &map, ControlSerializer *cs) { @@ -491,7 +493,7 @@ IPADataSerializer::deserialize(const std::vector &data, template<> ControlInfoMap IPADataSerializer::deserialize(const std::vector &data, - [[maybe_unused]] const std::vector &fds, + [[maybe_unused]] const std::vector &fds, ControlSerializer *cs) { return deserialize(data.cbegin(), data.end(), cs); @@ -501,15 +503,15 @@ template<> ControlInfoMap IPADataSerializer::deserialize(std::vector::const_iterator dataBegin, std::vector::const_iterator dataEnd, - [[maybe_unused]] std::vector::const_iterator fdsBegin, - [[maybe_unused]] std::vector::const_iterator fdsEnd, + [[maybe_unused]] std::vector::const_iterator fdsBegin, + [[maybe_unused]] std::vector::const_iterator fdsEnd, ControlSerializer *cs) { return deserialize(dataBegin, dataEnd, cs); } /* - * FileDescriptors are serialized into a single byte that tells if the + * FileDescriptors are serialized into four bytes that tells if the * FileDescriptor is valid or not. If it is valid, then for serialization * the fd will be written to the fd vector, or for deserialization the * fd vector const_iterator will be valid. @@ -517,42 +519,47 @@ IPADataSerializer::deserialize(std::vector::const_itera * This validity is necessary so that we don't send -1 fd over sendmsg(). It * also allows us to simply send the entire fd vector into the deserializer * and it will be recursively consumed as necessary. - * - * \todo Consider serializing the FileDescriptor in 4 bytes to ensure - * 32-bit alignment of all serialized data */ template<> -std::tuple, std::vector> +std::tuple, std::vector> IPADataSerializer::serialize(const FileDescriptor &data, [[maybe_unused]] ControlSerializer *cs) { - std::vector dataVec = { data.isValid() }; - std::vector fdVec; + std::vector dataVec; + std::vector fdVec; + + /* + * Store as uint32_t to prepare for conversion from validity flag + * to index, and for alignment. + */ + appendPOD(dataVec, data.isValid()); + if (data.isValid()) - fdVec.push_back(data.fd()); + fdVec.push_back(data); + return { dataVec, fdVec }; } template<> -FileDescriptor IPADataSerializer::deserialize(std::vector::const_iterator dataBegin, - std::vector::const_iterator dataEnd, - std::vector::const_iterator fdsBegin, - std::vector::const_iterator fdsEnd, +FileDescriptor IPADataSerializer::deserialize([[maybe_unused]] std::vector::const_iterator dataBegin, + [[maybe_unused]] std::vector::const_iterator dataEnd, + std::vector::const_iterator fdsBegin, + std::vector::const_iterator fdsEnd, [[maybe_unused]] ControlSerializer *cs) { - ASSERT(std::distance(dataBegin, dataEnd) >= 1); + ASSERT(std::distance(dataBegin, dataEnd) >= 4); - bool valid = !!(*dataBegin); + uint32_t valid = readPOD(dataBegin, 0, dataEnd); ASSERT(!(valid && std::distance(fdsBegin, fdsEnd) < 1)); - return valid ? FileDescriptor(*fdsBegin) : FileDescriptor(); + return valid ? *fdsBegin : FileDescriptor(); } template<> FileDescriptor IPADataSerializer::deserialize(const std::vector &data, - const std::vector &fds, + const std::vector &fds, [[maybe_unused]] ControlSerializer *cs) { return deserialize(data.cbegin(), data.end(), fds.cbegin(), fds.end()); @@ -561,19 +568,19 @@ FileDescriptor IPADataSerializer::deserialize(const std::vector< /* * FrameBuffer::Plane is serialized as: * - * 1 byte - FileDescriptor + * 4 byte - FileDescriptor * 4 bytes - uint32_t Length */ template<> -std::tuple, std::vector> +std::tuple, std::vector> IPADataSerializer::serialize(const FrameBuffer::Plane &data, [[maybe_unused]] ControlSerializer *cs) { std::vector dataVec; - std::vector fdsVec; + std::vector fdsVec; std::vector fdBuf; - std::vector fdFds; + std::vector fdFds; std::tie(fdBuf, fdFds) = IPADataSerializer::serialize(data.fd); dataVec.insert(dataVec.end(), fdBuf.begin(), fdBuf.end()); @@ -588,15 +595,15 @@ template<> FrameBuffer::Plane IPADataSerializer::deserialize(std::vector::const_iterator dataBegin, std::vector::const_iterator dataEnd, - std::vector::const_iterator fdsBegin, - [[maybe_unused]] std::vector::const_iterator fdsEnd, + std::vector::const_iterator fdsBegin, + [[maybe_unused]] std::vector::const_iterator fdsEnd, [[maybe_unused]] ControlSerializer *cs) { FrameBuffer::Plane ret; - ret.fd = IPADataSerializer::deserialize(dataBegin, dataBegin + 1, + ret.fd = IPADataSerializer::deserialize(dataBegin, dataBegin + 4, fdsBegin, fdsBegin + 1); - ret.length = readPOD(dataBegin, 1, dataEnd); + ret.length = readPOD(dataBegin, 4, dataEnd); return ret; } @@ -604,7 +611,7 @@ IPADataSerializer::deserialize(std::vector::const_i template<> FrameBuffer::Plane IPADataSerializer::deserialize(const std::vector &data, - const std::vector &fds, + const std::vector &fds, ControlSerializer *cs) { return deserialize(data.cbegin(), data.end(), fds.cbegin(), fds.end(), cs); diff --git a/src/libcamera/ipc_pipe.cpp b/src/libcamera/ipc_pipe.cpp index 28e20e03..84136a82 100644 --- a/src/libcamera/ipc_pipe.cpp +++ b/src/libcamera/ipc_pipe.cpp @@ -77,13 +77,17 @@ IPCMessage::IPCMessage(const Header &header) * * This essentially converts an IPCUnixSocket payload into an IPCMessage. * The header is extracted from the payload into the IPCMessage's header field. + * + * If the IPCUnixSocket payload had any valid file descriptors, then they will + * all be invalidated. */ -IPCMessage::IPCMessage(const IPCUnixSocket::Payload &payload) +IPCMessage::IPCMessage(IPCUnixSocket::Payload &payload) { memcpy(&header_, payload.data.data(), sizeof(header_)); data_ = std::vector(payload.data.begin() + sizeof(header_), payload.data.end()); - fds_ = payload.fds; + for (int32_t &fd : payload.fds) + fds_.push_back(FileDescriptor(std::move(fd))); } /** @@ -104,7 +108,9 @@ IPCUnixSocket::Payload IPCMessage::payload() const /* \todo Make this work without copy */ memcpy(payload.data.data() + sizeof(Header), data_.data(), data_.size()); - payload.fds = fds_; + + for (const FileDescriptor &fd : fds_) + payload.fds.push_back(fd.fd()); return payload; } diff --git a/test/serialization/ipa_data_serializer_test.cpp b/test/serialization/ipa_data_serializer_test.cpp index bf7e34e2..eca19a66 100644 --- a/test/serialization/ipa_data_serializer_test.cpp +++ b/test/serialization/ipa_data_serializer_test.cpp @@ -53,7 +53,7 @@ template int testPodSerdes(T in) { std::vector buf; - std::vector fds; + std::vector fds; std::tie(buf, fds) = IPADataSerializer::serialize(in); T out = IPADataSerializer::deserialize(buf, fds); @@ -72,7 +72,7 @@ int testVectorSerdes(const std::vector &in, ControlSerializer *cs = nullptr) { std::vector buf; - std::vector fds; + std::vector fds; std::tie(buf, fds) = IPADataSerializer>::serialize(in, cs); std::vector out = IPADataSerializer>::deserialize(buf, fds, cs); @@ -92,7 +92,7 @@ int testMapSerdes(const std::map &in, ControlSerializer *cs = nullptr) { std::vector buf; - std::vector fds; + std::vector fds; std::tie(buf, fds) = IPADataSerializer>::serialize(in, cs); std::map out = IPADataSerializer>::deserialize(buf, fds, cs); @@ -219,7 +219,7 @@ private: }; std::vector buf; - std::vector fds; + std::vector fds; if (testVectorSerdes(vecUint8) != TestPass) return TestFail; @@ -291,7 +291,7 @@ private: { { "a", { 1, 2, 3 } }, { "b", { 4, 5, 6 } }, { "c", { 7, 8, 9 } } }; std::vector buf; - std::vector fds; + std::vector fds; if (testMapSerdes(mapUintStr) != TestPass) return TestFail; @@ -359,7 +359,7 @@ private: std::string strEmpty = ""; std::vector buf; - std::vector fds; + std::vector fds; if (testPodSerdes(u32min) != TestPass) return TestFail; diff --git a/utils/ipc/generators/libcamera_templates/module_ipa_proxy.cpp.tmpl b/utils/ipc/generators/libcamera_templates/module_ipa_proxy.cpp.tmpl index a4e008c7..aab1fffb 100644 --- a/utils/ipc/generators/libcamera_templates/module_ipa_proxy.cpp.tmpl +++ b/utils/ipc/generators/libcamera_templates/module_ipa_proxy.cpp.tmpl @@ -236,7 +236,7 @@ void {{proxy_name}}::recvMessage(const IPCMessage &data) void {{proxy_name}}::{{method.mojom_name}}IPC( std::vector::const_iterator data, size_t dataSize, - [[maybe_unused]] const std::vector &fds) + [[maybe_unused]] const std::vector &fds) { {%- for param in method.parameters %} {{param|name}} {{param.mojom_name}}; diff --git a/utils/ipc/generators/libcamera_templates/module_ipa_proxy.h.tmpl b/utils/ipc/generators/libcamera_templates/module_ipa_proxy.h.tmpl index c222f5f2..1979e68f 100644 --- a/utils/ipc/generators/libcamera_templates/module_ipa_proxy.h.tmpl +++ b/utils/ipc/generators/libcamera_templates/module_ipa_proxy.h.tmpl @@ -65,7 +65,7 @@ private: void {{method.mojom_name}}IPC( std::vector::const_iterator data, size_t dataSize, - const std::vector &fds); + const std::vector &fds); {% endfor %} /* Helper class to invoke async functions in another thread. */ diff --git a/utils/ipc/generators/libcamera_templates/proxy_functions.tmpl b/utils/ipc/generators/libcamera_templates/proxy_functions.tmpl index ea9cc86b..ebcd2aaa 100644 --- a/utils/ipc/generators/libcamera_templates/proxy_functions.tmpl +++ b/utils/ipc/generators/libcamera_templates/proxy_functions.tmpl @@ -54,7 +54,7 @@ {%- for param in params %} std::vector {{param.mojom_name}}Buf; {%- if param|has_fd %} - std::vector {{param.mojom_name}}Fds; + std::vector {{param.mojom_name}}Fds; std::tie({{param.mojom_name}}Buf, {{param.mojom_name}}Fds) = {%- else %} std::tie({{param.mojom_name}}Buf, std::ignore) = diff --git a/utils/ipc/generators/libcamera_templates/serializer.tmpl b/utils/ipc/generators/libcamera_templates/serializer.tmpl index d8d55807..b8ef8e7b 100644 --- a/utils/ipc/generators/libcamera_templates/serializer.tmpl +++ b/utils/ipc/generators/libcamera_templates/serializer.tmpl @@ -40,7 +40,7 @@ retData.insert(retData.end(), {{field.mojom_name}}.begin(), {{field.mojom_name}}.end()); {%- elif field|is_fd %} std::vector {{field.mojom_name}}; - std::vector {{field.mojom_name}}Fds; + std::vector {{field.mojom_name}}Fds; std::tie({{field.mojom_name}}, {{field.mojom_name}}Fds) = IPADataSerializer<{{field|name}}>::serialize(data.{{field.mojom_name}}); retData.insert(retData.end(), {{field.mojom_name}}.begin(), {{field.mojom_name}}.end()); @@ -58,7 +58,7 @@ {%- elif field|is_plain_struct or field|is_array or field|is_map or field|is_str %} std::vector {{field.mojom_name}}; {%- if field|has_fd %} - std::vector {{field.mojom_name}}Fds; + std::vector {{field.mojom_name}}Fds; std::tie({{field.mojom_name}}, {{field.mojom_name}}Fds) = {%- else %} std::tie({{field.mojom_name}}, std::ignore) = @@ -104,9 +104,9 @@ dataSize -= {{field_size}}; {%- endif %} {% elif field|is_fd %} - {%- set field_size = 1 %} + {%- set field_size = 4 %} {{- check_data_size(field_size, 'dataSize', field.mojom_name, 'data')}} - ret.{{field.mojom_name}} = IPADataSerializer<{{field|name}}>::deserialize(m, m + 1, n, n + 1, cs); + ret.{{field.mojom_name}} = IPADataSerializer<{{field|name}}>::deserialize(m, m + {{field_size}}, n, n + 1, cs); {%- if not loop.last %} m += {{field_size}}; dataSize -= {{field_size}}; @@ -177,7 +177,7 @@ # \a struct. #} {%- macro serializer(struct, namespace) %} - static std::tuple, std::vector> + static std::tuple, std::vector> serialize(const {{struct|name_full}} &data, {%- if struct|needs_control_serializer %} ControlSerializer *cs) @@ -187,7 +187,7 @@ { std::vector retData; {%- if struct|has_fd %} - std::vector retFds; + std::vector retFds; {%- endif %} {%- for field in struct.fields %} {{serializer_field(field, namespace, loop)}} @@ -210,7 +210,7 @@ {%- macro deserializer_fd(struct, namespace) %} static {{struct|name_full}} deserialize(std::vector &data, - std::vector &fds, + std::vector &fds, {%- if struct|needs_control_serializer %} ControlSerializer *cs) {%- else %} @@ -224,8 +224,8 @@ static {{struct|name_full}} deserialize(std::vector::const_iterator dataBegin, std::vector::const_iterator dataEnd, - std::vector::const_iterator fdsBegin, - std::vector::const_iterator fdsEnd, + std::vector::const_iterator fdsBegin, + std::vector::const_iterator fdsEnd, {%- if struct|needs_control_serializer %} ControlSerializer *cs) {%- else %} @@ -234,7 +234,7 @@ { {{struct|name_full}} ret; std::vector::const_iterator m = dataBegin; - std::vector::const_iterator n = fdsBegin; + std::vector::const_iterator n = fdsBegin; size_t dataSize = std::distance(dataBegin, dataEnd); [[maybe_unused]] size_t fdsSize = std::distance(fdsBegin, fdsEnd); @@ -255,7 +255,7 @@ {%- macro deserializer_fd_simple(struct, namespace) %} static {{struct|name_full}} deserialize(std::vector &data, - [[maybe_unused]] std::vector &fds, + [[maybe_unused]] std::vector &fds, ControlSerializer *cs = nullptr) { return IPADataSerializer<{{struct|name_full}}>::deserialize(data.cbegin(), data.cend(), cs); @@ -264,8 +264,8 @@ static {{struct|name_full}} deserialize(std::vector::const_iterator dataBegin, std::vector::const_iterator dataEnd, - [[maybe_unused]] std::vector::const_iterator fdsBegin, - [[maybe_unused]] std::vector::const_iterator fdsEnd, + [[maybe_unused]] std::vector::const_iterator fdsBegin, + [[maybe_unused]] std::vector::const_iterator fdsEnd, ControlSerializer *cs = nullptr) { return IPADataSerializer<{{struct|name_full}}>::deserialize(dataBegin, dataEnd, cs);