1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
|
From 8986a688252a72bf55d0032120818a65fb15073a Mon Sep 17 00:00:00 2001
From: "Ramir \"Ramir0\" Sultanov" <ramir0.sultanov@gmail.com>
Date: Thu, 19 Sep 2024 13:03:12 +0300
Subject: [PATCH 1/2] Add compatibility with protobuf 28
Signed-off-by: Ramir Sultanov <ramir0.sultanov@gmail.com>
---
include/gz/transport/RepHandler.hh | 46 ++++++++++++++++++++-
include/gz/transport/SubscriptionHandler.hh | 24 ++++++++++-
2 files changed, 68 insertions(+), 2 deletions(-)
diff --git a/include/gz/transport/RepHandler.hh b/include/gz/transport/RepHandler.hh
index eb2e9d7c1..0ae1e6340 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<Req>(&_msgReq);
+ auto msgRep =
+ google::protobuf::DynamicCastMessage<Rep>(&_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<const Req*>(&_msgReq);
auto msgRep = google::protobuf::internal::DownCast<Rep*>(&_msgRep);
diff --git a/include/gz/transport/SubscriptionHandler.hh b/include/gz/transport/SubscriptionHandler.hh
index 6119e100e..e85eacc16 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<T>(&_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<const T*>(&_msg);
#elif GOOGLE_PROTOBUF_VERSION >= 3000000
auto msgPtr = google::protobuf::down_cast<const T*>(&_msg);
From ff01a7f5bf40eee4a8d451dc7e8baf9a703186b6 Mon Sep 17 00:00:00 2001
From: Ramir Sultanov <ramir0.sultanov@gmail.com>
Date: Sat, 26 Oct 2024 14:08:01 +0300
Subject: [PATCH 2/2] Add message verification after message down casts
Signed-off-by: Ramir Sultanov <ramir0.sultanov@gmail.com>
---
include/gz/transport/RepHandler.hh | 24 ++++++++++-----------
include/gz/transport/SubscriptionHandler.hh | 14 ++++++------
2 files changed, 19 insertions(+), 19 deletions(-)
diff --git a/include/gz/transport/RepHandler.hh b/include/gz/transport/RepHandler.hh
index 0ae1e6340..ad5329f88 100644
--- a/include/gz/transport/RepHandler.hh
+++ b/include/gz/transport/RepHandler.hh
@@ -146,6 +146,18 @@ namespace gz
google::protobuf::DynamicCastMessage<Req>(&_msgReq);
auto msgRep =
google::protobuf::DynamicCastMessage<Rep>(&_msgRep);
+#elif GOOGLE_PROTOBUF_VERSION >= 4022000
+ auto msgReq =
+ google::protobuf::internal::DownCast<const Req*>(&_msgReq);
+ auto msgRep = google::protobuf::internal::DownCast<Rep*>(&_msgRep);
+#elif GOOGLE_PROTOBUF_VERSION > 2999999
+ auto msgReq = google::protobuf::down_cast<const Req*>(&_msgReq);
+ auto msgRep = google::protobuf::down_cast<Rep*>(&_msgRep);
+#else
+ auto msgReq =
+ google::protobuf::internal::down_cast<const Req*>(&_msgReq);
+ auto msgRep = google::protobuf::internal::down_cast<Rep*>(&_msgRep);
+#endif
// Verify the dynamically casted messages are valid
if (msgReq == nullptr || msgRep == nullptr)
@@ -185,18 +197,6 @@ namespace gz
std::cerr.flush();
return false;
}
-#elif GOOGLE_PROTOBUF_VERSION >= 4022000
- auto msgReq =
- google::protobuf::internal::DownCast<const Req*>(&_msgReq);
- auto msgRep = google::protobuf::internal::DownCast<Rep*>(&_msgRep);
-#elif GOOGLE_PROTOBUF_VERSION > 2999999
- auto msgReq = google::protobuf::down_cast<const Req*>(&_msgReq);
- auto msgRep = google::protobuf::down_cast<Rep*>(&_msgRep);
-#else
- auto msgReq =
- google::protobuf::internal::down_cast<const Req*>(&_msgReq);
- auto msgRep = google::protobuf::internal::down_cast<Rep*>(&_msgRep);
-#endif
return this->cb(*msgReq, *msgRep);
}
diff --git a/include/gz/transport/SubscriptionHandler.hh b/include/gz/transport/SubscriptionHandler.hh
index e85eacc16..ed705ad92 100644
--- a/include/gz/transport/SubscriptionHandler.hh
+++ b/include/gz/transport/SubscriptionHandler.hh
@@ -216,6 +216,13 @@ namespace gz
#if GOOGLE_PROTOBUF_VERSION >= 5028000
auto msgPtr = google::protobuf::DynamicCastMessage<T>(&_msg);
+#elif GOOGLE_PROTOBUF_VERSION >= 4022000
+ auto msgPtr = google::protobuf::internal::DownCast<const T*>(&_msg);
+#elif GOOGLE_PROTOBUF_VERSION >= 3000000
+ auto msgPtr = google::protobuf::down_cast<const T*>(&_msg);
+#else
+ auto msgPtr = google::protobuf::internal::down_cast<const T*>(&_msg);
+#endif
// Verify the dynamically casted message is valid
if (msgPtr == nullptr)
@@ -236,13 +243,6 @@ namespace gz
std::cerr.flush();
return false;
}
-#elif GOOGLE_PROTOBUF_VERSION >= 4022000
- auto msgPtr = google::protobuf::internal::DownCast<const T*>(&_msg);
-#elif GOOGLE_PROTOBUF_VERSION >= 3000000
- auto msgPtr = google::protobuf::down_cast<const T*>(&_msg);
-#else
- auto msgPtr = google::protobuf::internal::down_cast<const T*>(&_msg);
-#endif
this->cb(*msgPtr, _info);
return true;
|