From 482e1cd00653c08db39231239a2dcf59d05c84b5 Mon Sep 17 00:00:00 2001 From: Erik Boasson Date: Mon, 25 Nov 2019 17:14:56 +0100 Subject: [PATCH] Fix rtps_start error handling on thread creation Signed-off-by: Erik Boasson Use static assert instead of run-time assert Signed-off-by: Erik Boasson Use static assertion to verify nn_rmsg offset calc Signed-off-by: Erik Boasson --- src/core/ddsc/src/dds_domain.c | 1 + src/core/ddsi/include/dds/ddsi/q_radmin.h | 1 + src/core/ddsi/src/q_init.c | 17 +++++++++++++---- src/core/ddsi/src/q_receive.c | 3 +-- 4 files changed, 16 insertions(+), 6 deletions(-) diff --git a/src/core/ddsc/src/dds_domain.c b/src/core/ddsc/src/dds_domain.c index 0b5a919..1769250 100644 --- a/src/core/ddsc/src/dds_domain.c +++ b/src/core/ddsc/src/dds_domain.c @@ -167,6 +167,7 @@ static dds_entity_t dds_domain_init (dds_domain *domain, dds_domainid_t domain_i return domh; fail_rtps_start: + dds__builtin_fini (domain); if (domain->gv.config.liveliness_monitoring && dds_global.threadmon_count == 1) ddsi_threadmon_stop (dds_global.threadmon); fail_threadmon_start: diff --git a/src/core/ddsi/include/dds/ddsi/q_radmin.h b/src/core/ddsi/include/dds/ddsi/q_radmin.h index f3d4a2d..3dde1be 100644 --- a/src/core/ddsi/include/dds/ddsi/q_radmin.h +++ b/src/core/ddsi/include/dds/ddsi/q_radmin.h @@ -98,6 +98,7 @@ struct nn_rmsg { struct nn_rmsg_chunk chunk; }; +DDSRT_STATIC_ASSERT (sizeof (struct nn_rmsg) == offsetof (struct nn_rmsg, chunk) + sizeof (struct nn_rmsg_chunk)); #define NN_RMSG_PAYLOAD(m) ((unsigned char *) (m + 1)) #define NN_RMSG_PAYLOADOFF(m, o) (NN_RMSG_PAYLOAD (m) + (o)) diff --git a/src/core/ddsi/src/q_init.c b/src/core/ddsi/src/q_init.c index e200483..ee10f46 100644 --- a/src/core/ddsi/src/q_init.c +++ b/src/core/ddsi/src/q_init.c @@ -1454,13 +1454,22 @@ int rtps_start (struct q_globals *gv) if (gv->listener) { if (create_thread (&gv->listen_ts, gv, "listen", (uint32_t (*) (void *)) listen_thread, gv->listener) != DDS_RETCODE_OK) - GVERROR ("rtps_start: can't create listener thread\n"); - /* FIXME: error handling */ + { + GVERROR ("failed to create TCP listener thread\n"); + ddsi_listener_free (gv->listener); + gv->listener = NULL; + rtps_stop (gv); + return -1; + } } if (gv->config.monitor_port >= 0) { - gv->debmon = new_debug_monitor (gv, gv->config.monitor_port); - /* FIXME: clean up */ + if ((gv->debmon = new_debug_monitor (gv, gv->config.monitor_port)) == NULL) + { + GVERROR ("failed to create debug monitor thread\n"); + rtps_stop (gv); + return -1; + } } return 0; diff --git a/src/core/ddsi/src/q_receive.c b/src/core/ddsi/src/q_receive.c index cb962fb..5ab6472 100644 --- a/src/core/ddsi/src/q_receive.c +++ b/src/core/ddsi/src/q_receive.c @@ -2894,8 +2894,7 @@ static bool do_packet (struct thread_state1 * const ts1, struct q_globals *gv, d return false; } - assert(sizeof(struct nn_rmsg) == offsetof(struct nn_rmsg, chunk) + sizeof(struct nn_rmsg_chunk)); - + DDSRT_STATIC_ASSERT (sizeof (struct nn_rmsg) == offsetof (struct nn_rmsg, chunk) + sizeof (struct nn_rmsg_chunk)); buff = (unsigned char *) NN_RMSG_PAYLOAD (rmsg); hdr = (Header_t*) buff;