diff --git a/include/gz/transport/RepHandler.hh b/include/gz/transport/RepHandler.hh index eb2e9d7c..0ae1e634 100644 --- a/include/gz/transport/RepHandler.hh +++ b/include/gz/transport/RepHandler.hh @@ -141,7 +141,51 @@ namespace gz return false; } -#if GOOGLE_PROTOBUF_VERSION >= 4022000 +#if GOOGLE_PROTOBUF_VERSION >= 5028000 + const auto msgReq = + google::protobuf::DynamicCastMessage(&_msgReq); + auto msgRep = + google::protobuf::DynamicCastMessage(&_msgRep); + + // Verify the dynamically casted messages are valid + if (msgReq == nullptr || msgRep == nullptr) + { + if (msgReq == nullptr) + { + if (_msgReq.GetDescriptor() != nullptr) + { + std::cerr << "RepHandler::RunLocalCallback() error: " + << "Failed to cast the request of the type " + << _msgReq.GetDescriptor()->full_name() + << " to the specified type" << '\n'; + } + else + { + std::cerr << "RepHandler::RunLocalCallback() error: " + << "Failed to cast the request of an unknown type" + << " to the specified type" << '\n'; + } + } + if (msgRep == nullptr) + { + if (_msgRep.GetDescriptor() != nullptr) + { + std::cerr << "RepHandler::RunLocalCallback() error: " + << "Failed to cast the response of the type " + << _msgRep.GetDescriptor()->full_name() + << " to the specified type" << '\n'; + } + else + { + std::cerr << "RepHandler::RunLocalCallback() error: " + << "Failed to cast the response of an unknown type" + << " to the specified type" << '\n'; + } + } + std::cerr.flush(); + return false; + } +#elif GOOGLE_PROTOBUF_VERSION >= 4022000 auto msgReq = google::protobuf::internal::DownCast(&_msgReq); auto msgRep = google::protobuf::internal::DownCast(&_msgRep); diff --git a/include/gz/transport/SubscriptionHandler.hh b/include/gz/transport/SubscriptionHandler.hh index 6119e100..e85eacc1 100644 --- a/include/gz/transport/SubscriptionHandler.hh +++ b/include/gz/transport/SubscriptionHandler.hh @@ -214,7 +214,29 @@ namespace gz if (!this->UpdateThrottling()) return true; -#if GOOGLE_PROTOBUF_VERSION >= 4022000 +#if GOOGLE_PROTOBUF_VERSION >= 5028000 + auto msgPtr = google::protobuf::DynamicCastMessage(&_msg); + + // Verify the dynamically casted message is valid + if (msgPtr == nullptr) + { + if (_msg.GetDescriptor() != nullptr) + { + std::cerr << "SubscriptionHandler::RunLocalCallback() error: " + << "Failed to cast the message of the type " + << _msg.GetDescriptor()->full_name() + << " to the specified type" << '\n'; + } + else + { + std::cerr << "SubscriptionHandler::RunLocalCallback() error: " + << "Failed to cast the message of an unknown type" + << " to the specified type" << '\n'; + } + std::cerr.flush(); + return false; + } +#elif GOOGLE_PROTOBUF_VERSION >= 4022000 auto msgPtr = google::protobuf::internal::DownCast(&_msg); #elif GOOGLE_PROTOBUF_VERSION >= 3000000 auto msgPtr = google::protobuf::down_cast(&_msg);