From f1ca8bff7d31c8f3dcc348a324cc8cd253694a00 Mon Sep 17 00:00:00 2001 From: Christian Eggers Date: Tue, 12 Jul 2022 16:58:25 +0200 Subject: [PATCH 1/8] Connection: remove const attribute from addMatch and removeMatch methods These methods use sendMethodCall() which in turn is non-const. Signed-off-by: Christian Eggers --- src/dbus_connection.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/dbus_connection.h b/src/dbus_connection.h index c0f6dcf..f229b76 100644 --- a/src/dbus_connection.h +++ b/src/dbus_connection.h @@ -344,7 +344,7 @@ class Connection : public std::enable_shared_from_this { } template - auto addMatch(const MatchRule& rule, CompletionToken&& token) const + auto addMatch(const MatchRule& rule, CompletionToken&& token) { return sendMethodCall({ DBus::Name, {DBus::Object, DBus::Interface, "AddMatch"}, {rule.str()} }, @@ -352,7 +352,7 @@ class Connection : public std::enable_shared_from_this { } template - auto removeMatch(const MatchRule& rule, CompletionToken&& token) const + auto removeMatch(const MatchRule& rule, CompletionToken&& token) { return sendMethodCall({ DBus::Name, {DBus::Object, DBus::Interface, "RemoveMatch"}, {rule.str()} }, From d630009947ab2765656e78d4a489fafb67b1e7ae Mon Sep 17 00:00:00 2001 From: Christian Eggers Date: Tue, 12 Jul 2022 17:46:35 +0200 Subject: [PATCH 2/8] Log: remove unnecessary const attribute warning: type qualifiers ignored on cast result type [-Wignored-qualifiers] Signed-off-by: Christian Eggers --- src/dbus_log.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/dbus_log.cpp b/src/dbus_log.cpp index 227210a..e5447be 100644 --- a/src/dbus_log.cpp +++ b/src/dbus_log.cpp @@ -66,7 +66,7 @@ void DBus::Log::writeHex(std::size_t type, const std::string& prefix, for (std::size_t i = 0; i < size; ++i) { const unsigned char byte = *(first + i); oss << std::hex << std::setw(2) << std::setfill('0') - << static_cast(byte) << ' '; + << static_cast(byte) << ' '; *ascii++ = ::isprint(byte) ? byte : '.'; if (++column == maxColumns) { column = 0; From e70d264206232bbfdf175a6d6d906780cdfdfb1d Mon Sep 17 00:00:00 2001 From: Christian Eggers Date: Tue, 12 Jul 2022 17:48:17 +0200 Subject: [PATCH 3/8] Message: don't cast away const attribute MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit warning: cast from type ‘const uint8_t*’ {aka ‘const unsigned char*’} to type ‘uint32_t*’ {aka ‘unsigned int*’} casts away qualifiers [-Wcast-qual] Signed-off-by: Christian Eggers --- src/dbus_message.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/dbus_message.cpp b/src/dbus_message.cpp index 55f82b0..b67049d 100644 --- a/src/dbus_message.cpp +++ b/src/dbus_message.cpp @@ -233,7 +233,7 @@ DBus::Message::Header::getSize(const OctetBuffer& message) // Add size of the header fields array const Endian endianness = Message::endianness(message); - size += correctEndianess(endianness, *(uint32_t*)(message.data() + 12)); + size += correctEndianess(endianness, *reinterpret_cast(message.data() + 12)); // Add padding to an 8 byte boundary size += (size % 8 == 0) ? 0 : 8 - (size % 8); @@ -250,7 +250,7 @@ DBus::Message::Header::getMessageSize(const OctetBuffer& message) return 0; // TODO: throw instead? const Endian endianness = Message::endianness(message); - std::size_t body_size = correctEndianess(endianness, *(uint32_t*)(message.data() + 4)); + std::size_t body_size = correctEndianess(endianness, *reinterpret_cast(message.data() + 4)); std::size_t msg_size = getSize(message) + body_size; if (msg_size > Message::MaximumSize) From a42224e2d97f91e7f474be2eabd6d21256f0acbe Mon Sep 17 00:00:00 2001 From: Christian Eggers Date: Tue, 12 Jul 2022 17:51:06 +0200 Subject: [PATCH 4/8] Name: use unsigned type for loop index MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit warning: comparison of integer expressions of different signedness: ‘int’ and ‘std::__cxx11::basic_string::size_type’ {aka ‘unsigned int’} [-Wsign-compare] Signed-off-by: Christian Eggers --- src/dbus_names.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/dbus_names.cpp b/src/dbus_names.cpp index 0509c1b..e1d1b9b 100644 --- a/src/dbus_names.cpp +++ b/src/dbus_names.cpp @@ -83,7 +83,7 @@ DBus::Name::validate(const std::string& name, Type type) const bool havePeriod = false; char prev = '.'; - for (int i = isUnique ? 1 : 0; i < name.size(); ++i) { + for (std::size_t i = isUnique ? 1 : 0; i < name.size(); ++i) { const char ch = name[i]; if (allowPeriod && ch == '.') { if (prev == '.') From 3accf322768f88621586bb0b56757aa62405df49 Mon Sep 17 00:00:00 2001 From: Christian Eggers Date: Tue, 12 Jul 2022 17:52:25 +0200 Subject: [PATCH 5/8] Type::Array: don't cast away 'const' attribute MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit warning: cast from type ‘const uint32_t*’ {aka ‘const unsigned int*’} to type ‘char*’ casts away qualifiers [-Wcast-qual] Use C++ style cast. Signed-off-by: Christian Eggers --- src/dbus_type_array.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/dbus_type_array.cpp b/src/dbus_type_array.cpp index 2c9fc47..b3135c7 100644 --- a/src/dbus_type_array.cpp +++ b/src/dbus_type_array.cpp @@ -60,7 +60,7 @@ void DBus::Type::Array::marshall(MessageOStream& stream) const if (contentsSize > Array::MaximumSize) throw std::out_of_range("Array " + getSignature() + ": size " + std::to_string(contentsSize) + " exceeds 64 MiB"); - stream.data.replace(sizePos, 4, (char*)&contentsSize, sizeof(uint32_t)); + stream.data.replace(sizePos, 4, reinterpret_cast(&contentsSize), sizeof(uint32_t)); } void DBus::Type::Array::unmarshall(MessageIStream& stream) From 9efa84952b2f6668c7d7b52f699127612639923a Mon Sep 17 00:00:00 2001 From: Christian Eggers Date: Tue, 12 Jul 2022 18:13:20 +0200 Subject: [PATCH 6/8] Transport: don't use variable length arrays (VLA) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit warning: ISO C++ forbids variable length array ‘fdbuf’ [-Wvla] Signed-off-by: Christian Eggers --- src/dbus_transport.h | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/src/dbus_transport.h b/src/dbus_transport.h index 23dff8c..d2df127 100644 --- a/src/dbus_transport.h +++ b/src/dbus_transport.h @@ -93,9 +93,10 @@ class Transport : public std::enable_shared_from_this { msg.msg_iov = &iov; msg.msg_iovlen = 1; - char fdbuf[CMSG_SPACE(self->m_maxRecvUnixFds * sizeof(int))]; - msg.msg_control = fdbuf; - msg.msg_controllen = sizeof(fdbuf); + std::size_t fdbufSize = CMSG_SPACE(self->m_maxRecvUnixFds * sizeof(int)); + std::unique_ptr fdbuf(::new char[fdbufSize]); + msg.msg_control = fdbuf.get(); + msg.msg_controllen = fdbufSize; ssize_t read_total = 0; do { @@ -163,9 +164,10 @@ class Transport : public std::enable_shared_from_this { msg.msg_iovlen = 1; const size_t fdlen = payload->fds.size() * sizeof(int); - char fdbuf[CMSG_SPACE(fdlen)]; - msg.msg_control = fdbuf; - msg.msg_controllen = sizeof(fdbuf); + std::size_t fdbufSize = CMSG_SPACE(fdlen); + std::unique_ptr fdbuf(::new char[fdbufSize]); + msg.msg_control = fdbuf.get(); + msg.msg_controllen = fdbufSize; struct cmsghdr *cmsg = CMSG_FIRSTHDR(&msg); cmsg->cmsg_len = CMSG_LEN(fdlen); From 95ce22d000aa3a8f50fbdcbe9d20a5aae5937581 Mon Sep 17 00:00:00 2001 From: Christian Eggers Date: Tue, 12 Jul 2022 18:15:57 +0200 Subject: [PATCH 7/8] Connection: fix includes MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit I get the following compiler errors when I only include dbus_connection.h: error: ‘WellKnownName’ does not name a type error: ‘MatchRule’ does not name a type error: ‘MatchRule’ was not declared in this scope error: template argument 1 is invalid ... error: request for member ‘str’ in ‘rule’, which is of non-class type ‘const int’ ... Header files should be mostly self contained. Signed-off-by: Christian Eggers --- src/dbus_connection.h | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/dbus_connection.h b/src/dbus_connection.h index f229b76..cb51d36 100644 --- a/src/dbus_connection.h +++ b/src/dbus_connection.h @@ -19,14 +19,21 @@ #include "dbus_asio.h" #include "dbus_auth.h" +#include "dbus_matchrule.h" #include "dbus_messageprotocol.h" #include "dbus_transport.h" +#include #include +#include #include +#include +#include namespace DBus { +struct WellKnownName; + static constexpr char const *Name = "org.freedesktop.DBus"; static constexpr char const *Object = "/org/freedesktop/DBus"; static constexpr char const *Interface = "org.freedesktop.DBus"; From 38205acfc4574ecc567fd3a9e8c97a6dca416c55 Mon Sep 17 00:00:00 2001 From: Christian Eggers Date: Mon, 18 Jul 2022 15:19:02 +0200 Subject: [PATCH 8/8] cmake: use full path for header files Required if dbus-asio is included via add_subdirectory() Signed-off-by: Christian Eggers --- CMakeLists.txt | 72 +++++++++++++++++++++++++------------------------- 1 file changed, 36 insertions(+), 36 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index a7d76c5..b1497b4 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -6,42 +6,42 @@ set(CMAKE_CXX_VISIBILITY_PRESET protected) set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -fuse-ld=gold") set(HEADER_FILES - src/dbus_asio.h - src/dbus_auth.h - src/dbus_connection.h - src/dbus_error.h - src/dbus.h - src/dbus_introspectable.h - src/dbus_log.h - src/dbus_matchrule.h - src/dbus_message.h - src/dbus_messageprotocol.h - src/dbus_messageostream.h - src/dbus_messageistream.h - src/dbus_names.h - src/dbus_octetbuffer.h - src/dbus_platform.h - src/dbus_transport.h - src/dbus_type.h - src/dbus_type_any.h - src/dbus_type_array.h - src/dbus_type_boolean.h - src/dbus_type_byte.h - src/dbus_type_dictentry.h - src/dbus_type_double.h - src/dbus_type_int16.h - src/dbus_type_int32.h - src/dbus_type_int64.h - src/dbus_type_objectpath.h - src/dbus_type_signature.h - src/dbus_type_string.h - src/dbus_type_struct.h - src/dbus_type_uint16.h - src/dbus_type_uint32.h - src/dbus_type_uint64.h - src/dbus_type_unixfd.h - src/dbus_type_variant.h - src/dbus_utils.h + ${CMAKE_CURRENT_LIST_DIR}/src/dbus_asio.h + ${CMAKE_CURRENT_LIST_DIR}/src/dbus_auth.h + ${CMAKE_CURRENT_LIST_DIR}/src/dbus_connection.h + ${CMAKE_CURRENT_LIST_DIR}/src/dbus_error.h + ${CMAKE_CURRENT_LIST_DIR}/src/dbus.h + ${CMAKE_CURRENT_LIST_DIR}/src/dbus_introspectable.h + ${CMAKE_CURRENT_LIST_DIR}/src/dbus_log.h + ${CMAKE_CURRENT_LIST_DIR}/src/dbus_matchrule.h + ${CMAKE_CURRENT_LIST_DIR}/src/dbus_message.h + ${CMAKE_CURRENT_LIST_DIR}/src/dbus_messageprotocol.h + ${CMAKE_CURRENT_LIST_DIR}/src/dbus_messageostream.h + ${CMAKE_CURRENT_LIST_DIR}/src/dbus_messageistream.h + ${CMAKE_CURRENT_LIST_DIR}/src/dbus_names.h + ${CMAKE_CURRENT_LIST_DIR}/src/dbus_octetbuffer.h + ${CMAKE_CURRENT_LIST_DIR}/src/dbus_platform.h + ${CMAKE_CURRENT_LIST_DIR}/src/dbus_transport.h + ${CMAKE_CURRENT_LIST_DIR}/src/dbus_type.h + ${CMAKE_CURRENT_LIST_DIR}/src/dbus_type_any.h + ${CMAKE_CURRENT_LIST_DIR}/src/dbus_type_array.h + ${CMAKE_CURRENT_LIST_DIR}/src/dbus_type_boolean.h + ${CMAKE_CURRENT_LIST_DIR}/src/dbus_type_byte.h + ${CMAKE_CURRENT_LIST_DIR}/src/dbus_type_dictentry.h + ${CMAKE_CURRENT_LIST_DIR}/src/dbus_type_double.h + ${CMAKE_CURRENT_LIST_DIR}/src/dbus_type_int16.h + ${CMAKE_CURRENT_LIST_DIR}/src/dbus_type_int32.h + ${CMAKE_CURRENT_LIST_DIR}/src/dbus_type_int64.h + ${CMAKE_CURRENT_LIST_DIR}/src/dbus_type_objectpath.h + ${CMAKE_CURRENT_LIST_DIR}/src/dbus_type_signature.h + ${CMAKE_CURRENT_LIST_DIR}/src/dbus_type_string.h + ${CMAKE_CURRENT_LIST_DIR}/src/dbus_type_struct.h + ${CMAKE_CURRENT_LIST_DIR}/src/dbus_type_uint16.h + ${CMAKE_CURRENT_LIST_DIR}/src/dbus_type_uint32.h + ${CMAKE_CURRENT_LIST_DIR}/src/dbus_type_uint64.h + ${CMAKE_CURRENT_LIST_DIR}/src/dbus_type_unixfd.h + ${CMAKE_CURRENT_LIST_DIR}/src/dbus_type_variant.h + ${CMAKE_CURRENT_LIST_DIR}/src/dbus_utils.h ) add_library(dbus-asio SHARED