From bc4b6aa9c7d5cf6ddfaa03b5721f3368779f58ef Mon Sep 17 00:00:00 2001 From: Michel Hidalgo Date: Fri, 19 Jun 2020 15:31:24 -0300 Subject: [PATCH 1/3] Keep domain id if ROS_DOMAIN_ID is invalid. Signed-off-by: Michel Hidalgo --- rcl/src/rcl/domain_id.c | 11 ++++++++--- rcl/test/rcl/test_domain_id.cpp | 22 +++++++++++++++++++--- 2 files changed, 27 insertions(+), 6 deletions(-) diff --git a/rcl/src/rcl/domain_id.c b/rcl/src/rcl/domain_id.c index 84b705281..9cb4b3d39 100644 --- a/rcl/src/rcl/domain_id.c +++ b/rcl/src/rcl/domain_id.c @@ -14,6 +14,7 @@ #include "rcl/domain_id.h" +#include #include #include "rcutils/get_env.h" @@ -40,10 +41,14 @@ rcl_get_default_domain_id(size_t * domain_id) get_env_error_str); return RCL_RET_ERROR; } - if (ros_domain_id) { + if (ros_domain_id && strcmp(ros_domain_id, "") != 0) { unsigned long number = strtoul(ros_domain_id, NULL, 0); // NOLINT(runtime/int) - if (number == ULONG_MAX) { - RCL_SET_ERROR_MSG("failed to interpret ROS_DOMAIN_ID as integral number"); + if (number == 0UL && strspn(ros_domain_id, "0") != strlen(ros_domain_id)) { + RCL_SET_ERROR_MSG("ROS_DOMAIN_ID is not an integral number"); + return RCL_RET_ERROR; + } + if (number == ULONG_MAX && errno == ERANGE) { + RCL_SET_ERROR_MSG("ROS_DOMAIN_ID is out of range"); return RCL_RET_ERROR; } *domain_id = (size_t)number; diff --git a/rcl/test/rcl/test_domain_id.cpp b/rcl/test/rcl/test_domain_id.cpp index fc964df21..b5d4616bc 100644 --- a/rcl/test/rcl/test_domain_id.cpp +++ b/rcl/test/rcl/test_domain_id.cpp @@ -22,15 +22,31 @@ TEST(TestGetDomainId, test_nominal) { ASSERT_TRUE(rcutils_set_env("ROS_DOMAIN_ID", "42")); - size_t domain_id = 0u; + size_t domain_id = RCL_DEFAULT_DOMAIN_ID; EXPECT_EQ(RCL_RET_OK, rcl_get_default_domain_id(&domain_id)); EXPECT_EQ(42u, domain_id); + ASSERT_TRUE(rcutils_set_env("ROS_DOMAIN_ID", "")); + domain_id = RCL_DEFAULT_DOMAIN_ID; + EXPECT_EQ(RCL_RET_OK, rcl_get_default_domain_id(&domain_id)); + EXPECT_EQ(RCL_DEFAULT_DOMAIN_ID, domain_id); + + ASSERT_TRUE(rcutils_set_env("ROS_DOMAIN_ID", "0000")); + domain_id = RCL_DEFAULT_DOMAIN_ID; + EXPECT_EQ(RCL_RET_OK, rcl_get_default_domain_id(&domain_id)); + EXPECT_EQ(0u, domain_id); + + ASSERT_TRUE(rcutils_set_env("ROS_DOMAIN_ID", "0 not really")); + domain_id = RCL_DEFAULT_DOMAIN_ID; + EXPECT_EQ(RCL_RET_ERROR, rcl_get_default_domain_id(&domain_id)); + rcl_reset_error(); + EXPECT_EQ(RCL_DEFAULT_DOMAIN_ID, domain_id); + ASSERT_TRUE(rcutils_set_env("ROS_DOMAIN_ID", "998446744073709551615")); - domain_id = 0u; + domain_id = RCL_DEFAULT_DOMAIN_ID; EXPECT_EQ(RCL_RET_ERROR, rcl_get_default_domain_id(&domain_id)); rcl_reset_error(); - EXPECT_EQ(0u, domain_id); + EXPECT_EQ(RCL_DEFAULT_DOMAIN_ID, domain_id); EXPECT_EQ(RCL_RET_INVALID_ARGUMENT, rcl_get_default_domain_id(nullptr)); } From 3349bdb222c6f37c793260ff5d27b13f8300cab5 Mon Sep 17 00:00:00 2001 From: Michel Hidalgo Date: Mon, 22 Jun 2020 10:30:08 -0300 Subject: [PATCH 2/3] Improve rcl_get_default_domain_id() error checking. Signed-off-by: Michel Hidalgo --- rcl/src/rcl/domain_id.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/rcl/src/rcl/domain_id.c b/rcl/src/rcl/domain_id.c index 9cb4b3d39..7a35acc85 100644 --- a/rcl/src/rcl/domain_id.c +++ b/rcl/src/rcl/domain_id.c @@ -42,12 +42,13 @@ rcl_get_default_domain_id(size_t * domain_id) return RCL_RET_ERROR; } if (ros_domain_id && strcmp(ros_domain_id, "") != 0) { - unsigned long number = strtoul(ros_domain_id, NULL, 0); // NOLINT(runtime/int) - if (number == 0UL && strspn(ros_domain_id, "0") != strlen(ros_domain_id)) { + char * end = NULL; + unsigned long number = strtoul(ros_domain_id, &end, 0); // NOLINT(runtime/int) + if (number == 0UL && *end != NULL) { RCL_SET_ERROR_MSG("ROS_DOMAIN_ID is not an integral number"); return RCL_RET_ERROR; } - if (number == ULONG_MAX && errno == ERANGE) { + if ((number == ULONG_MAX && errno == ERANGE) || number > SIZE_MAX) { RCL_SET_ERROR_MSG("ROS_DOMAIN_ID is out of range"); return RCL_RET_ERROR; } From 6fa7b4b66919fa9814a68b20f2cfb4bcdbf54584 Mon Sep 17 00:00:00 2001 From: Michel Hidalgo Date: Mon, 22 Jun 2020 10:59:39 -0300 Subject: [PATCH 3/3] Use null character. Signed-off-by: Michel Hidalgo --- rcl/src/rcl/domain_id.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rcl/src/rcl/domain_id.c b/rcl/src/rcl/domain_id.c index 7a35acc85..07f586995 100644 --- a/rcl/src/rcl/domain_id.c +++ b/rcl/src/rcl/domain_id.c @@ -44,7 +44,7 @@ rcl_get_default_domain_id(size_t * domain_id) if (ros_domain_id && strcmp(ros_domain_id, "") != 0) { char * end = NULL; unsigned long number = strtoul(ros_domain_id, &end, 0); // NOLINT(runtime/int) - if (number == 0UL && *end != NULL) { + if (number == 0UL && *end != '\0') { RCL_SET_ERROR_MSG("ROS_DOMAIN_ID is not an integral number"); return RCL_RET_ERROR; }