Skip to content

Commit 616e192

Browse files
pablogs9mergify[bot]
authored andcommitted
Fix topic and type name handling (#254)
* Fix topic and type name handling Signed-off-by: Pablo Garrido <pablogs9@gmail.com> * Uncrusty Signed-off-by: Pablo Garrido <pablogs9@gmail.com> * Update rmw_microxrcedds_c/src/rmw_microxrcedds_topic.c * Fix Signed-off-by: Pablo Garrido <pablogs9@gmail.com> * Typo Signed-off-by: Pablo Garrido <pablogs9@gmail.com> * Fix Signed-off-by: Pablo Garrido <pablogs9@gmail.com> (cherry picked from commit 5f34520)
1 parent b0f9724 commit 616e192

5 files changed

Lines changed: 67 additions & 39 deletions

File tree

rmw_microxrcedds_c/src/rmw_client.c

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -120,15 +120,25 @@ rmw_create_client(
120120
#else
121121
static char req_type_name[RMW_UXRCE_TYPE_NAME_MAX_LENGTH];
122122
static char res_type_name[RMW_UXRCE_TYPE_NAME_MAX_LENGTH];
123-
generate_service_types(
124-
custom_client->type_support_callbacks, req_type_name, res_type_name,
125-
RMW_UXRCE_TYPE_NAME_MAX_LENGTH);
123+
if (!generate_service_types(
124+
custom_client->type_support_callbacks, req_type_name, res_type_name,
125+
RMW_UXRCE_TYPE_NAME_MAX_LENGTH))
126+
{
127+
RMW_UROS_TRACE_MESSAGE("Not enough memory for service type names")
128+
put_memory(&client_memory, &custom_client->mem);
129+
goto fail;
130+
}
126131

127132
static char req_topic_name[RMW_UXRCE_TOPIC_NAME_MAX_LENGTH];
128133
static char res_topic_name[RMW_UXRCE_TOPIC_NAME_MAX_LENGTH];
129-
generate_service_topics(
130-
service_name, req_topic_name, res_topic_name,
131-
RMW_UXRCE_TOPIC_NAME_MAX_LENGTH);
134+
if (!generate_service_topics(
135+
service_name, req_topic_name, res_topic_name,
136+
RMW_UXRCE_TOPIC_NAME_MAX_LENGTH))
137+
{
138+
RMW_UROS_TRACE_MESSAGE("Not enough memory for service topic names")
139+
put_memory(&client_memory, &custom_client->mem);
140+
goto fail;
141+
}
132142

133143
client_req = uxr_buffer_create_requester_bin(
134144
&custom_node->context->session,

rmw_microxrcedds_c/src/rmw_microros_internal/utils.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -32,23 +32,23 @@ int generate_name(
3232
char name[],
3333
size_t buffer_size);
3434

35-
size_t generate_type_name(
35+
bool generate_type_name(
3636
const message_type_support_callbacks_t * members,
3737
char type_name[],
3838
size_t buffer_size);
3939

40-
int generate_topic_name(
40+
bool generate_topic_name(
4141
const char * topic_name,
4242
char * full_topic_name,
4343
size_t full_topic_name_size);
4444

45-
int generate_service_types(
45+
bool generate_service_types(
4646
const service_type_support_callbacks_t * members,
4747
char * request_type,
4848
char * reply_type,
4949
size_t buffer_size);
5050

51-
int generate_service_topics(
51+
bool generate_service_topics(
5252
const char * service_name,
5353
char * request_topic,
5454
char * reply_topic,

rmw_microxrcedds_c/src/rmw_microxrcedds_topic.c

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -71,8 +71,19 @@ create_topic(
7171
static char full_topic_name[RMW_UXRCE_TOPIC_NAME_MAX_LENGTH];
7272
static char type_name[RMW_UXRCE_TYPE_NAME_MAX_LENGTH];
7373

74-
generate_topic_name(topic_name, full_topic_name, sizeof(full_topic_name));
75-
generate_type_name(message_type_support_callbacks, type_name, sizeof(type_name));
74+
if (!generate_topic_name(topic_name, full_topic_name, sizeof(full_topic_name))) {
75+
RMW_UROS_TRACE_MESSAGE("Error creating topic name");
76+
rmw_uxrce_fini_topic_memory(custom_topic);
77+
custom_topic = NULL;
78+
goto fail;
79+
}
80+
81+
if (!generate_type_name(message_type_support_callbacks, type_name, sizeof(type_name))) {
82+
RMW_UROS_TRACE_MESSAGE("Error creating type name");
83+
rmw_uxrce_fini_topic_memory(custom_topic);
84+
custom_topic = NULL;
85+
goto fail;
86+
}
7687

7788
topic_req = uxr_buffer_create_topic_bin(
7889
&custom_node->context->session,

rmw_microxrcedds_c/src/rmw_service.c

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -118,15 +118,25 @@ rmw_create_service(
118118
#else
119119
static char req_type_name[RMW_UXRCE_TYPE_NAME_MAX_LENGTH];
120120
static char res_type_name[RMW_UXRCE_TYPE_NAME_MAX_LENGTH];
121-
generate_service_types(
122-
custom_service->type_support_callbacks, req_type_name, res_type_name,
123-
RMW_UXRCE_TYPE_NAME_MAX_LENGTH);
121+
if (!generate_service_types(
122+
custom_service->type_support_callbacks, req_type_name, res_type_name,
123+
RMW_UXRCE_TYPE_NAME_MAX_LENGTH))
124+
{
125+
RMW_UROS_TRACE_MESSAGE("Not enough memory for service type names")
126+
put_memory(&service_memory, &custom_service->mem);
127+
goto fail;
128+
}
124129

125130
static char req_topic_name[RMW_UXRCE_TOPIC_NAME_MAX_LENGTH];
126131
static char res_topic_name[RMW_UXRCE_TOPIC_NAME_MAX_LENGTH];
127-
generate_service_topics(
128-
service_name, req_topic_name, res_topic_name,
129-
RMW_UXRCE_TOPIC_NAME_MAX_LENGTH);
132+
if (!generate_service_topics(
133+
service_name, req_topic_name, res_topic_name,
134+
RMW_UXRCE_TOPIC_NAME_MAX_LENGTH))
135+
{
136+
RMW_UROS_TRACE_MESSAGE("Not enough memory for service topic names")
137+
put_memory(&service_memory, &custom_service->mem);
138+
goto fail;
139+
}
130140

131141
service_req = uxr_buffer_create_replier_bin(
132142
&custom_node->context->session,

rmw_microxrcedds_c/src/utils.c

Lines changed: 18 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -120,24 +120,25 @@ int build_participant_xml(
120120
return ret;
121121
}
122122

123-
int generate_service_topics(
123+
bool generate_service_topics(
124124
const char * service_name,
125125
char * request_topic,
126126
char * reply_topic,
127127
size_t buffer_size)
128128
{
129-
snprintf(
129+
int ret_req = snprintf(
130130
request_topic, buffer_size, "%s%s%s", ros_request_prefix,
131131
service_name, ros_request_subfix);
132132

133-
snprintf(
133+
int ret_rep = snprintf(
134134
reply_topic, buffer_size, "%s%s%s", ros_reply_prefix,
135135
service_name, ros_reply_subfix);
136136

137-
return 1;
137+
return (ret_req >= 0) && (ret_req < (int)buffer_size) && (ret_rep >= 0) &&
138+
(ret_rep < (int)buffer_size);
138139
}
139140

140-
int generate_service_types(
141+
bool generate_service_types(
141142
const service_type_support_callbacks_t * members,
142143
char * request_type,
143144
char * reply_type,
@@ -151,10 +152,11 @@ int generate_service_types(
151152
const message_type_support_callbacks_t * res_callbacks =
152153
(const message_type_support_callbacks_t *)res_members->data;
153154

154-
generate_type_name(req_callbacks, request_type, buffer_size);
155-
generate_type_name(res_callbacks, reply_type, buffer_size);
155+
bool ret = true;
156+
ret &= generate_type_name(req_callbacks, request_type, buffer_size);
157+
ret &= generate_type_name(res_callbacks, reply_type, buffer_size);
156158

157-
return 0;
159+
return ret;
158160
}
159161

160162
int build_service_xml(
@@ -287,21 +289,18 @@ int generate_name(
287289
return ret;
288290
}
289291

290-
size_t generate_type_name(
292+
bool generate_type_name(
291293
const message_type_support_callbacks_t * members,
292294
char type_name[],
293295
size_t buffer_size)
294296
{
295297
static const char * sep = "::";
296298
static const char * protocol = "dds";
297299
static const char * suffix = "_";
298-
size_t full_name_size = strlen(protocol) + strlen(suffix) + strlen(sep) + strlen(
299-
members->message_name_) + strlen(suffix) +
300-
((NULL != members->message_namespace_) ? strlen(members->message_namespace_) : 0) + 1;
301300

302301
type_name[0] = 0;
303302

304-
snprintf(
303+
int ret = snprintf(
305304
type_name, buffer_size,
306305
"%s%s%s%s%s%s%s",
307306
(NULL != members->message_namespace_) ? members->message_namespace_ : "",
@@ -313,10 +312,10 @@ size_t generate_type_name(
313312
suffix
314313
);
315314

316-
return full_name_size;
315+
return (ret >= 0) && (ret < (int)buffer_size);
317316
}
318317

319-
int generate_topic_name(
318+
bool generate_topic_name(
320319
const char * topic_name,
321320
char * full_topic_name,
322321
size_t full_topic_name_size)
@@ -327,10 +326,8 @@ int generate_topic_name(
327326
"%s%s",
328327
ros_topic_prefix,
329328
topic_name);
330-
if ((ret < 0) && (ret >= (int)full_topic_name_size)) {
331-
return 0;
332-
}
333-
return ret;
329+
330+
return (ret >= 0) && (ret < (int)full_topic_name_size);
334331
}
335332

336333
int build_topic_xml(
@@ -352,7 +349,7 @@ int build_topic_xml(
352349
static char type_name_buffer[RMW_UXRCE_TYPE_NAME_MAX_LENGTH];
353350

354351
if (RMW_UXRCE_TOPIC_NAME_MAX_LENGTH >= strlen(topic_name) &&
355-
0 != generate_type_name(members, type_name_buffer, sizeof(type_name_buffer)))
352+
generate_type_name(members, type_name_buffer, sizeof(type_name_buffer)))
356353
{
357354
char full_topic_name[RMW_UXRCE_TOPIC_NAME_MAX_LENGTH + 1 + sizeof(ros_topic_prefix)];
358355

@@ -390,7 +387,7 @@ int build_xml(
390387
int ret = 0;
391388
static char type_name_buffer[RMW_UXRCE_TYPE_NAME_MAX_LENGTH];
392389

393-
if (0 != generate_type_name(members, type_name_buffer, sizeof(type_name_buffer))) {
390+
if (generate_type_name(members, type_name_buffer, sizeof(type_name_buffer))) {
394391
char full_topic_name[RMW_UXRCE_TOPIC_NAME_MAX_LENGTH + 1 + sizeof(ros_topic_prefix)];
395392
full_topic_name[0] = '\0';
396393

0 commit comments

Comments
 (0)